我写了这样的查询来检查json列是否有键
SELECT *
FROM "details"
where ("data"->'country'->'state'->>'city') is not null;
但我需要编写查询,如果“data”包含“city”
,将选择行json数据结构不一致。
答案 0 :(得分:9)
您可以按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
);
这当然效率不高。
答案 1 :(得分:-1)
您可以将json转换为文本并使用LIKE
搜索密钥SELECT *
FROM "details"
WHERE "data"::text LIKE '%"city":%'