如何防止PDO将问号解释为占位符?

2022-08-30 19:47:44

为了检测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不要理会问号。??


答案 1

使用函数调用窗体。根据系统目录,hstore 运算符使用以下函数:?exist

regress=# select oprname, oprcode from pg_operator where oprname = '?';
 oprname | oprcode 
---------+---------
 ?       | exist
(1 row)

所以你可以写:

SELECT * FROM tbl WHERE exist(hst,'foo');

(就我个人而言,我不是hstore以运算符为中心的设计和文档的忠实粉丝,我认为它丢弃了基于函数的接口的有用的自我记录属性,没有任何真正的好处,我通常使用它的函数调用而不是它的运算符。仅仅因为您可以定义运算符并不意味着您应该这样做。


答案 2

我在搜索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);

推荐