存在Postgresql JSON列检查键

时间:2016-03-24 07:52:23

标签: sql json postgresql

我写了这样的查询来检查json列是否有键

SELECT *
FROM "details" 
where ("data"->'country'->'state'->>'city') is not null; 

但我需要编写查询,如果“data”包含“city”

,将选择行

json数据结构不一致。

2 个答案:

答案 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":%'