小编vib*_*bby的帖子

PostgreSql:展平 json 数组数据

从我当前的查询中,我获得了这个 jsonb 数据:

values: "a1", ["b1", "b2"]
Run Code Online (Sandbox Code Playgroud)

我只想将它压平在一个级别上,如下所示:

values: "a1", "b1", "b2"
Run Code Online (Sandbox Code Playgroud)

这是在查询中获取数据的简化方法(只有 2 个级别是可能的,永远不会更多):

SELECT * 
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)

我尝试使用 jsonb_array_elements 但我的问题是:我不知道它是否是一个 json 数组!不是 SQL 专家,我没有找到一种方法来编写类似的代码:

SELECT
    IF (is_json_array(list)) 
        jsonb_array_elements(list)
    ELSE
        list
    ENDIF
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)

对于我当前数据的“缩小”视图,这是一个无表工作测试:

with recursive search_key_recursive (jsonlevel) as(
    values ('{"fr": {"WantedKey": "a1", "Sub": [{"WantedKey": ["b1", "b2"]}], "AnotherSub": [{"WantedKey": "c1"}]}}'::jsonb)
    union all
    select 
        case jsonb_typeof(jsonlevel)           
            when 'object' then (jsonb_each(jsonlevel)).value        
            when 'array' then jsonb_array_elements(jsonlevel)   
        end as jsonlevel
    from search_key_recursive where jsonb_typeof(jsonlevel) in ('object', …
Run Code Online (Sandbox Code Playgroud)

postgresql array json postgresql-9.4

4
推荐指数
1
解决办法
9309
查看次数

标签 统计

array ×1

json ×1

postgresql ×1

postgresql-9.4 ×1