Redshift-从键值对提取值的SQL脚本

时间:2018-10-17 11:41:05

标签: json regex amazon-redshift

我有一个包含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。谢谢

3 个答案:

答案 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
;