sql - Postgresql JSON 列检查键是否存在

标签 sql json postgresql

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

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

但我需要编写查询,如果“数据”包含“城市”,它将选择行

数据json结构不一致

最佳答案

您可以使用 ? 检查 datatop-level 键,如 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
);

这当然效率不高。

关于sql - Postgresql JSON 列检查键是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195409/

相关文章:

sql - mysql fulltext 有没有办法选择相关性作为列?

javascript - AngularJS - 禁用 float 过滤

javascript - 解析数组Json来选择Tag

postgresql - 加入postgresql

sql - JOIN FETCH 中缺少 Hibernate @Where 子句

sql - 使用 get_results() 执行时查询返回不同的结果

mysql - 将唯一值添加到 mySql 中的现有表

javascript - 根据嵌套键值计算对象

sql - 在不创建表的情况下使用 json_populate_recordset?

postgresql - 如果已经存在空记录,如何在 seqeulize 中添加非空约束?