如何使用可选参数创建SQL SELECT查询


How to create a SQL SELECT query with optional parameters

我有一个PHP方法,它有很多参数,所有这些参数都是可选的。SQL查询使用这些参数从员工数据库中进行选择,其中每个参数都类似于技能/角色。它看起来像这样:

getMedicalStaff($active = 1, $consultant = 0, $ana = 0, $outreach = 0, $prescribedBy = 0, $respiteCare = 0)

创建SQL查询以从数据库中选择行的最佳方法是什么?考虑到每个参数可能需要也可能不需要?我知道理论上可以调用这种方法而不要求任何东西,但在实践中这不太可能发生。

我试过几种不同的方法,但没有一种能正常工作。我的第一次尝试是这样的:

// Build query
$argActive = ($active == 1) ? 'true' : 'false';
SELECT * FROM MedStaff WHERE Active = $argActive 

但这显然是有缺陷的,因为当某些字段的值无关紧要时,它会要求它们明确为假。

我尝试的下一件事是像这样构建SQL查询:

$argActive = (active == 1) ? 'active = true' : '';

但是,在不知道下一个自变量变量是否真的包含任何内容的情况下,我将不得不用AND填充每个自变量变量之间的空白。

我也试过这个:

$argActive = ($active == 1) ? '= true' : 'IS NULL';
$sql = "SELECT * FROM MedStaff WHERE Active $argActive 

问题是,即使数据库字段为"空",我也不能保证它们是显式NULL(我继承了数据库设计),所以这似乎不起作用。

解决我的困境的最佳方法是什么?这感觉像是一个以前遇到过很多次的问题,必须有一个标准的公认答案,但我一直没能在谷歌上找到一个有效的答案。

使用条件数组:

$wheres = array();
if ($active) {
    $wheres[] = 'active = true';
}
if ($consultant)
    $wheres[] = 'consultant = true';
}

然后将它们与implode():组合

$where_string = implode(' AND ', $wheres);
$sql = "SELECT * FROM MedStaff";
if ($where_string) {
    $sql .= " WHERE " . $where_string;
}