【问题标题】:Postgresql JSON column check key existsPostgresql JSON 列检查键是否存在
【发布时间】:2016-03-24 07:52:22
【问题描述】:

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

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

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

json数据结构不一致。

【问题讨论】:

    标签: sql json postgresql


    【解决方案1】:

    您可以使用? 来检查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
    );
    

    这当然不是很有效。

    【讨论】:

    • 这适用于 JSONB 列。问题是关于 JSON 列的,因此您必须进行类型转换:SELECT * FROM details WHERE data::JSONB ? 'city';
    【解决方案2】:

    你可以使用?:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 某些 json 值可能包含“城市”文本。你如何区分这个键名还是文本?
      • 这适用于我的情况,其中 value 是这样的列表 ["abc", "edf"]
      猜你喜欢
      • 2018-07-26
      • 1970-01-01
      • 2017-02-16
      • 2021-06-27
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多