为了检测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功能:
?
exist
regress=# select oprname, oprcode from pg_operator where oprname = '?'; oprname | oprcode ---------+--------- ? | exist (1 row)
所以你可以这样写:
SELECT * FROM tbl WHERE exist(hst,'foo');
(个人而言,我不是hstore以操作员为中心的设计和文档的忠实拥护者,我认为它放弃了基于函数的接口的有用的自我记录属性,而没有任何实际好处,并且我通常使用其函数调用而不是其操作员。只是因为您可以定义运算符并不意味着您应该这样做。)