vib*_*bby 4 postgresql array json postgresql-9.4
从我当前的查询中,我获得了这个 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', 'array')
)
select search_key_recursive.jsonlevel->'WantedKey'
from search_key_recursive
where jsonlevel ? 'WantedKey';
Run Code Online (Sandbox Code Playgroud)
对于之后,我将在插入语句中使用结果:
INSERT INTO table1
SELECT 'someText', value
FROM jsonb_array_elements('{"test": ["a1", "b1", "c1"]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)
知道了 !
SELECT
case jsonb_typeof(json)
when 'string' then json->>0
when 'array' then jsonb_array_elements_text(json)
end
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test') as json;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9309 次 |
最近记录: |