我有这个查询返回匹配的行。我需要忽略变量为null的条件。 :
如果$ data [0]为null,则它将变为
$parameters = array ($data[1], $data[2]);
$result = pg_query_params(connect(), 'SELECT * FROM person WHERE surname= $1 and status=$2', $parameters);
如果$ data [0]和$ data [2]为空,它将变为:
$parameters = array ($data[1]);
$result = pg_query_params(connect(), 'SELECT * FROM person WHERE surname= $1', $parameters);
等等......
这是当前的查询:
$parameters = array ($data[0], $data[1], $data[2]);
$result = pg_query_params(connect(), 'SELECT * FROM person WHERE name = $1 and surname= $2 and status=$3', $parameters);
我读到了coalesce(),但不知道如何包含参数$ 1,$ 2,$ 3。
答案 0 :(得分:1)
这是一个经典问题:使用WHERE子句构建一个查询,该子句从一组可选条件中过滤。以下是如何以相当通用的方式实现,以适应任何列的组合。
首先,输入参数需要连接到PHP中的列名,以便您可以通过编程方式解决它们。我们可以使用关联数组:
$columns = array("name"=>$data[0], "surname"=>$data[1], ...etc...);
然后循环遍历它们以生成(进入数组)每个单独的相等性测试(colname=$N
)以获取非空输入:
$clauses = array();
$non_null_params = array();
$param_index=1;
foreach ($columns as $name=>$value) {
if ($value !== null) {
$clauses[] = "$name=\${$param_index}";
$param_index++;
$non_null_params[] = $value;
}
}
如果根本没有结果条款,则要么没有WHERE过滤,要么根据要求生成错误。
if (empty($clauses)) {
$where_clause = ""; // or error out?
}
否则将各个colname=$N
子句粘合到一个查询片段中:
$where_clause = "WHERE " . implode(" AND ", $clauses);
最终使用一组非null参数运行动态查询:
pg_query_params("SELECT some_columns $where_clause", $non_null_params);