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

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

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

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

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

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

$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();

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

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

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

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

Ответ 1

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

или определить собственного оператора без "?" вместо этого.

Например:

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

Таким образом, вместо ?, ?| и ?& можно использовать [email protected], [email protected]| и [email protected]& соответственно. например.

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