pg_query_params 查询空值

pg_query_params query for null values

我有这个查询 returns 匹配的行。我需要忽略变量为 null ex 的条件。 :

如果 $data[0] 为空,它将变为

$parameters = array ($data[1], $data[2]);       
$result = pg_query_params(connect(), 'SELECT * FROM person WHERE surname=  and status=', $parameters);

如果 $data[0] 和 $data[2] 为空,它将变为:

$parameters = array ($data[1]);         
$result = pg_query_params(connect(), 'SELECT * FROM person WHERE surname= ', $parameters);

等等...

这是当前查询:

$parameters = array ($data[0], $data[1], $data[2]);         
$result = pg_query_params(connect(), 'SELECT * FROM person WHERE name =  and surname=  and status=', $parameters);

我阅读了有关 coalesce() 的内容,但不知道如何包含参数 $1、$2、$3。

这是一个经典问题:使用从一组可选条件中过滤的 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);

最终 运行 具有一组非空参数的动态查询:

pg_query_params("SELECT some_columns $where_clause", $non_null_params);