Для обнаружения существования ключа в hstore мне нужно запустить такой запрос:
SELECT * FROM tbl WHERE hst ? 'foo'
Однако это дает мне PDOException:
PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound: SELECT * FROM tbl WHERE hst ? 'foo'
Есть ли способ избежать вопросительного знака, чтобы PDO не забирал его в качестве заполнителя? Я пробовал до четырех обратных косых черт, а также двойной вопросительный знак ( ??
), но ничто, кажется, не убеждает PDO оставить знак вопроса в одиночку.
Используйте форму вызова функции. Согласно системным каталогам, hstore ?
оператор использует функцию exist
:
regress=# select oprname, oprcode from pg_operator where oprname = '?'; oprname | oprcode ---------+--------- ? | exist (1 row)
поэтому вы можете написать:
SELECT * FROM tbl WHERE exist(hst,'foo');
(Лично я не являюсь большим поклонником конструкторской документации и документации hstore, я думаю, что он отбрасывает полезные самодокументирующие свойства функционального интерфейса без какой-либо реальной выгоды, и я обычно использую его вызовы функций, а не его операторы. потому что вы можете определить операторы, это не значит, что вы должны.)
У меня была такая же проблема при поиске по данным JSONB. Полный вопрос здесь
SELECT * FROM post WHERE locations ? :location;
Обходной путь PostgreSQL 9.5
аналогичен:
SELECT * FROM post WHERE jsonb_exists(locations, :location);
Я также открыл билет в системе отслеживания ошибок PHP
Как упоминалось в Diabl0, предлагаемое решение работает, но не использует индекс. Протестировано с помощью:
CREATE INDEX tempidxgin ON post USING GIN (locations);
Я предлагаю вам отключить собственный подготовленный оператор PDO, поэтому вопросительные знаки будут игнорироваться:
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);