Экзистенциальные операторы jsonb с параметризованными запросами

…или вопросительный знак вопроса.

В настоящее время я реализую функцию поиска для базы данных postgres, в php, которая использует новый тип jsonb.

Чтобы добиться этого, я выполняю подготовленные заявления с именованными заполнителями.

Однако я столкнулся с интересной проблемой, пытаясь использовать некоторые из новых postgres JSON операторы сдерживания и существования наряду с именными заполнителями.

Основой проблемы является то, что операторы сами используют знак вопроса ? как часть их синтаксиса. то есть

? Существует ли строка ключа / элемента в значении JSON?

?| Существуют ли какие-либо из этих строк ключей / элементов?

?& Все ли эти строки ключей / элементов существуют?

Это означает, что у меня есть заявления, которые выглядят так в PHP.

$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta ? :value");
$sth->bindValue(1, $value, PDO::PARAM_STR);
$sth->execute();

Это терпит неудачу, потому что вопросительный знак интерпретируется как заполнитель.
Чтобы обойти это, я попытался сделать сам оператор именованным параметром, например, так.

$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta :operator :value");
$sth->bindValue(1, $operator, PDO::PARAM_STR);
$sth->bindValue(2, $value, PDO::PARAM_STR);
$sth->execute();

Однако это просто выдает ту же ошибку, что и использование оператора голого, то есть

ERROR: syntax error at or near \"$1\"1

Кто-нибудь еще сталкивался с этой проблемой или кто-нибудь может придумать хороший обходной путь?

Есть ли способ избежать или пропустить вопросительный знак, чтобы можно было использовать операторы postgres jsonb и существования с параметризованными запросами PDO?

12

Решение

вы можете использовать соответствующие функции вместо операторов (jsonb_exists, jsonb_exists_any, jsonb_exists_all). например запустить \do+ "?" в psql чтобы увидеть имя функции? оператор.

или определите свой собственный оператор без «?» символ вместо.

Например:

CREATE OPERATOR ~@ (LEFTARG = jsonb, RIGHTARG = text, PROCEDURE = jsonb_exists)
CREATE OPERATOR ~@| (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_any)
CREATE OPERATOR ~@& (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_all)

Так что можно использовать ~@, ~@| а также ~@& на месте ?, ?| а также ?& соответственно. например

$sth = $dbh->prepare("SELECT * FROM stuff WHERE meta ~@ :value");
$sth->bindValue(1, $value, PDO::PARAM_STR);
$sth->execute();
19

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]