PostgreSQL JSON列检查键存在

tp5buhyn  于 2023-05-19  发布在  PostgreSQL
关注(0)|答案(3)|浏览(80)

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

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

如果“数据”中包含“城市”,我们如何编写查询将选择行
JSON数据结构不一致。

kmbjn2e3

kmbjn2e31#

data顶级键可以用?来检查,就像documentation里面说的那样。
举个例子

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
);

这当然不是很有效。

unhi4e5o

unhi4e5o2#

可以使用?

SELECT *
FROM "details" 
WHERE data->'country'->'state' ? 'city';
irtuqstp

irtuqstp3#

您可以将json转换为文本并使用LIKE搜索密钥

SELECT *
FROM "details"
WHERE "data"::text LIKE '%"city":%'

相关问题