此问题可视为此Question的副本。 它确实指出了与PDO相同的问题。但它的解决方案解决方案有点不同,因为目标不同。我将在那里发布JSONB的解决方法和PHP票证的链接。
当我准备以下查询时:
SELECT * FROM post WHERE locations ? :location;
发生以下警告:
警告:PDO :: prepare():SQLSTATE [HY093]:参数号无效:第xx行/ path/file.php中的命名和位置参数混合
问号是有效的PostgreSQL operator,但PDO会将其视为占位符。
是否有正确的方法来配置PDO以忽略问号作为占位符?
我将发布一个解决方法。希望有更好的方法
修改 我在PHP错误跟踪系统
中添加ticket答案 0 :(得分:5)
这是我的问题的解决方法。它通过使用PostgreSQL函数替换?
运算符来解决问题。
我真的不喜欢它,因为它不会使PDO更符合PostgreSQL。但我发现没有真正的解决方案。
CREATE FUNCTION json_key_exists(JSONB,TEXT) RETURNS BOOLEAN LANGUAGE SQL STABLE AS $f$
SELECT $1 ? $2
$f$;
现在我可以使用查询:
SELECT * FROM post WHERE json_key_exists(locations, :location);
来自freenode #postgresql
的神话般的RhodiumToad提出了解决方法正如@Abelisto建议的那样,没有必要创建上面的函数,因为jsonb_exists(jsonb, text)
是avialabe
答案 1 :(得分:1)
好的,最简单的方法是create the new operator使用相同的选项,例如:
-- Operator: ~!@#%^&(jsonb, text)
-- DROP OPERATOR ~!@#%^&(jsonb, text);
CREATE OPERATOR
~!@#%^& -- Change it to any other non-conflicted symbols combination
(
PROCEDURE = jsonb_exists,
LEFTARG = jsonb,
RIGHTARG = text,
RESTRICT = contsel,
JOIN = contjoinsel);
COMMENT ON OPERATOR ~!@#%^&(jsonb, text) IS 'key exists';
(原始脚本由pgAdmin生成)
并以通常的方式使用它,如
SELECT * FROM post WHERE locations ~!@#%^& :location;
答案 2 :(得分:0)
答案 3 :(得分:0)
对于搜索键并根据Yoann的答案,我已经测试了表达式(jsonbData?'keySearched')等同于jsonb_exists(jsonbData,'keySearched')
答案 4 :(得分:0)
使用CREATE OPERATOR ~@& (LEFTARG = jsonb, RIGHTARG = text[], PROCEDURE = jsonb_exists_any)
并使用〜@&代替?|一切都会很好
答案 5 :(得分:0)
这对我有用:
jsonb_exists(some_jsonb_array,'search_value');