Redshift - SQL-скрипт для извлечения значения из пары ключ-значение - PullRequest
0 голосов
/ 17 октября 2018

У меня есть столбцы, содержащие данные 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 голосов
/ 17 октября 2018

Вы можете делать то, что вам нужно, как это

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;
0 голосов
/ 18 октября 2018

Строка JSON в вашем примере недопустима, потому что Name не заключена в двойные кавычки.

Если предположить, что это опечатка, и это допустимая строка JSON, то вы можете использовать JSON функционирует для извлечения нужных значений из столбца.

Пример (я добавил кавычки вокруг "Имя"):

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
;
0 голосов
/ 17 октября 2018

Я ничего не знаю о Redshift, так что это может не сработать.Это работает в JavaScript:

/"(id\d)":\s\{"key": "?(\w+)"?/g

Затем вам нужно будет извлечь Group 1, содержащий id и Group 2, содержащий key.

Регулярное выражение начинается ссопоставление двойной кавычки, затем создание группы со словом «id», за которым следуют цифра, двоеточие, пробел, левая фигурная скобка, двойная кавычка, слово «ключ», двоеточие, пробел, необязательный двойнойцитаты.Наконец, он создает группу с одним или несколькими символами Word, за которой следует необязательная двойная кавычка.

Как я уже сказал, я не знаю Redshift, например, вам, возможно, придется избегать двойных кавычек.

...