запрос pg_query_params для нулевых значений

0

У меня есть этот запрос, который возвращает соответствующие строки. Мне нужно игнорировать условие, для которого переменная имеет значение 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.

  • 1
    Если $ date [0] равно нулю, вы можете добавить это к вашему запросу: OR NULL IS $ 1
  • 0
    @FrankHeikens: Извините, я понял, что не правильно задал вопрос и внес изменения.
Показать ещё 2 комментария
Теги:
select

1 ответ

1
Лучший ответ

Это классическая проблема: построение запроса с предложением 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);
  • 0
    В пятой строке кода, в котором вы создаете запрос, вы должны случайно добавить дополнительный символ «=». Я полагаю, вы имели в виду, если ($ значение! = Ноль)
  • 0
    Спасибо, это то, что я искал. Однако это работает только в тех случаях, когда все поля имеют значение NULL или когда все поля не являются NULL, но не в тех случаях, когда некоторые имеют значение NULL, а другие нет. Как только я закончу это исправлять, я приму ваш ответ и добавлю комментарии с изменениями.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню