在 PostgreSQL 中检查 JSON 类型列中是否存在字段

74

如何检查Postgres中的json字段是否具有特定元素?

我尝试使用json->>'属性'不为null,但没有成功。

3个回答

107

使用->

where (json->'attribute') is not null

当我尝试这个时,出现了错误 无法从标量中提取元素 - Chad
2
@Chad,你可能需要将你的内容转换为正确的类型,使用where (myfield::json->'attribute') is not null - maennel
2
FYI,括号不是必需的。 - sage88
5
存在 != 不为 null。 - Brendan Metcalfe
@brendan 是的,你说得对。但我并没有声称它是这样的。 - Roman Pekar
9
如果json路径不存在,column->'attribute'会返回null。如果该路径存在但值为null,例如column = '{"attribute":null}',那么column->>'attribute'也会返回null。 - Ether

53

虽然此方法有效,但最好使用特殊运算符?

WHERE your_column_name::jsonb ? 'attribute'

注意:仅适用于 jsonb 类型。


4
如果列已经是 jsonb 类型,则不需要进行强制转换。对于 jsonb 列,这是一个更加简洁的解决方案。 - sage88
这对于JSONB确实更清洁。 - Roman Pekar
5
请注意,? 运算符仅适用于顶级属性。如果您想检查 JSON 结构较低处的路径是否存在,请按照 Roman 的答案执行 .. where column->'foo'->'bar'->'baz' is not null - Ether
表达式 .. WHERE column->'foo'->'bar'->'baz' IS NOT NULL 至少在 Postgres 9.4 中不起作用,您需要用 ( ) 包围左侧部分,以使表达式起作用:.. WHERE (column->'foo'->'bar'->'baz') IS NOT NULL - Mariano Ruiz
我很想知道为什么在@RomanPekar的解决方案中建议使用?运算符而不是->运算符。 - Rocket Appliances
3
当你使用->时,它会检查your_column_name.attribute的值是否存在,而?则会检查attribute是否存在。例如:obj.field IS NULL将返回true,但obj ? 'field'将返回false - Eugen Konkov

1

如果你的列名是json类型,这个方法同样适用:

SELECT * FROM table_name WHERE your_column_name->>'attribute' is not NULL;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接