如何查询 PostgreSQL 9.5 JSONB 列中是否存在某个键?

How to query the existence of a key in PostgreSQL 9.5 JSONB column?

我有一个 PostgreSQL 9.5 数据库 table,其中有一个名为 attrs 的 JSONB 列。我想检查该 attires 列中是否存在特定键。我想我可以使用?运算符,但我不明白语法。

SELECT * FROM cereal WHERE attrs ? 'lbs';

这个returns,"The number of minded parameters < the number of parameter markers."

SELECT * FROM cereal WHERE attrs ? | ARRAY['lbs'];

这个returns,"The number of minded parameters < the number of parameter markers."

如何查询 JSONB 列中是否存在键?

您的第一个查询确实准确无误。

? 运算符确实有一个限制,即它只检查 jsonb 值的顶级键。因此,您要查找的密钥很可能深埋在 JSON 文档中的某处。您可以使用多个 jsonb 运算符或处理函数来向下钻取键应该位于的位置,然后进行测试:->#>jsonb_each()jsonb_array_elements(),等等。所以你在结果上使用任何这些和 运行 ? 运算符,比如:

SELECT *
FROM cereal
WHERE (attrs -> 'weight') ? 'lbs';

...对于 JSON 文档,如:

{"ingredients": {...}, "weight": {"lbs": 4, "kg": 1.8}, ...}

如果不了解您的 JSON 文档的结构,您将无法获得更具体的答案。

这不是 postgresql 错误。您的查询很好。错误是你的,无论你使用什么 运行 该查询都会混淆 ? 参数占位符,你必须修复你尝试 运行 查询的方式,而你没有'提供足够的信息给你一个提示。