У меня есть этот запрос, который возвращает соответствующие строки. Мне нужно игнорировать условие, для которого переменная имеет значение null ex. :
Если $ 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.
Это классическая проблема: построение запроса с предложением WHERE, которое фильтрует из набора необязательных критериев. Здесь вы можете реализовать довольно общий способ размещения любой комбинации столбцов.
Сначала входные параметры должны быть связаны с именами столбцов в PHP, чтобы вы могли программно их решать. Мы можем использовать для этого ассоциативный массив:
$columns = array("name"=>$data[0], "surname"=>$data[1], ...etc...);
Затем перебирайте их для генерации (в массив) каждого отдельного теста равенства (colname=$N
) для 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
отдельные colname=$N
вместе в фрагмент запроса:
$where_clause = "WHERE " . implode(" AND ", $clauses);
И в конечном итоге запустить динамический запрос с набором ненулевых параметров:
pg_query_params("SELECT some_columns $where_clause", $non_null_params);