我有一个包含JSON数据的列,如下所示。我正在尝试提取与列中每个键对相对应的值。任何人都可以建议我如何使用SQL
[{"id": 101, "id1": {"key": "SaleId", "type": "identifier", "regex": null}, "id2": {"key": Name, "type": "identifier", "regex": null}, "id3": {"key": null, "type": "identifier", "regex": null}}]
键值是id1,id2,id3
预期输出:
id1 : SaleId
id2 : Name
id3 : null
我正在使用Redshift。谢谢
答案 0 :(得分:0)
我对Redshift一无所知,所以这可能行不通。 它可以在JavaScript中使用:
/"(id\d)":\s\{"key": "?(\w+)"?/g
然后,您必须提取包含Group 1
的{{1}}和包含id
的{{1}}。
正则表达式首先匹配双引号,然后创建带有单词'id'的组,后跟数字,冒号,空格,左花括号,双引号,单词'key',冒号,一个空格,一个可选的双引号。最后,它会创建一个带有一个或多个Word字符的组,然后是可选的双引号。
正如我所说,例如,我不了解Redshift,您可能必须转义双引号。
答案 1 :(得分:0)
您可以这样做
with t as
(
select '[{"id": 101, ' ||
'"id1": {"key": "SaleId", "type": "identifier", "regex": "null"}, ' ||
'"id2": {"key": "Name", "type": "identifier", "regex": "null"}, ' ||
'"id3": {"key": "null", "type": "identifier", "regex": "null"}}]' as str
)
select 'id1:' || json_extract_path_text(substring(str,2,length(str)-2),'id1','key'),
'id2:' || json_extract_path_text(substring(str,2,length(str)-2),'id2','key'),
'id3:' || json_extract_path_text(substring(str,2,length(str)-2),'id3','key')
from t;
答案 2 :(得分:0)
您的示例中的JSON字符串无效,因为Name
不在双引号中。
假设这是一个错字,并且它是一个有效的JSON字符串,那么您可以使用JSON functions从列中提取所需的值。
示例(我在“名称”周围添加了引号):
create temp table jsontest (myjsonstring varchar(1000))
;
insert into jsontest(myjsonstring)
values ('[{"id": 101, "id1": {"key": "SaleId", "type": "identifier", "regex": null}, "id2": {"key": "Name", "type": "identifier", "regex": null}, "id3": {"key": null, "type": "identifier", "regex": null}}]')
;
select 'id1', json_extract_path_text(json_extract_array_element_text(myjsonstring, 0) , 'id1', 'key') from jsontest
union all
select 'id2', json_extract_path_text(json_extract_array_element_text(myjsonstring, 0) , 'id2', 'key') from jsontest
union all
select 'id3', json_extract_path_text(json_extract_array_element_text(myjsonstring, 0) , 'id3', 'key') from jsontest
;