pg_query_params查询空值

时间:2015-02-17 13:14:10

标签: php postgresql select

我有这个查询返回匹配的行。我需要忽略变量为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。

1 个答案:

答案 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);