【问题标题】:get all the json object with a specified conditions获取所有指定条件的json对象
【发布时间】:2021-05-16 07:09:12
【问题描述】:

我有一个如下所示的 jsonarray

[{"key1":10},{"key1":20},{"key1":30}]

我想获取所有指定条件的json对象。说获取 key1 小于 25 的所有 json 对象。所以我的 sql 查询应该返回这个列表

[{"key1":10},{"key1":20}]

生成的 SQL 查询是什么。

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    step-by-step demo:db<>fiddle

    SELECT
        json_agg(elements)                       -- 3
    FROM mytable,
        json_array_elements(mydata) as elements  -- 1
    WHERE (elements ->> 'key1')::int < 25        -- 2
    
    1. 提取 JSON 数组:每个元素现在都在自己的记录中
    2. 按值过滤。请注意,-&gt;&gt; 返回类型 text,因此您需要将其转换为类型 int
    3. 将剩余元素重新聚合到新数组中

    【讨论】:

    • 试过这个查询没用 SELECT json_agg(elements) -- 3 FROM object_repository, json_array_elements(core_attributes) as elements -- 1 WHERE (elements ->> 'key1')::int
    • 您输入了jsonb,而不是您在问题中写的json。那么,在这种情况下,你需要jsonb_agg() 而不是json_agg() 以及jsonb_array_elements 而不是json_array_elements
    【解决方案2】:

    如果您使用的是 Postgres 12 或更高版本,则可以使用 JSON 路径函数:

    select jsonb_path_query_array(the_column, '$[*] ? (@.key1 <= 25)')
    from the_table
    

    Online example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 2016-12-28
      • 2016-10-12
      • 2021-03-12
      • 2017-09-23
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多