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

… или вопрос вопроса вопроса.

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

Для этого я выполняю подготовленные заявления с именованными заполнителями.

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

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

? Существует ли строка ключа / элемента в значении 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

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

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

вы можете использовать соответствующие функции вместо операторов (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();