我写了这样的查询来检查JSON列是否有键
SELECT * FROM "details" where ("data"->'country'->'state'->>'city') is not null;
如果“数据”中包含“城市”,我们如何编写查询将选择行JSON数据结构不一致。
kmbjn2e31#
data的顶级键可以用?来检查,就像documentation里面说的那样。举个例子
data
?
SELECT * FROM details WHERE data ? 'city';
检查json列中所有嵌套对象中的每个键需要递归CTE
select * from details where 'city' in ( WITH RECURSIVE t(k,j) as ( select jsonb_object_keys(details.data), details.data UNION ALL select jsonb_object_keys(t.j->t.k), t.j->t.k FROM t WHERE jsonb_typeof(t.j->t.k) = 'object' ) select k from t );
这当然不是很有效。
unhi4e5o2#
可以使用?:
SELECT * FROM "details" WHERE data->'country'->'state' ? 'city';
irtuqstp3#
您可以将json转换为文本并使用LIKE搜索密钥
SELECT * FROM "details" WHERE "data"::text LIKE '%"city":%'
3条答案
按热度按时间kmbjn2e31#
data
的顶级键可以用?
来检查,就像documentation里面说的那样。举个例子
检查json列中所有嵌套对象中的每个键需要递归CTE
这当然不是很有效。
unhi4e5o2#
可以使用
?
:irtuqstp3#
您可以将json转换为文本并使用LIKE搜索密钥