#sql #split #amazon-redshift
#sql #разделить #amazon-redshift
Вопрос:
Я хочу создать таблицу, содержащую строки, созданные из журнала. Моя структура журнала
{"date":"..","by":..,"action":"..""argument":".."},
{"date":"..","by":..,"action":"..""argument":".."},
{"date":"..","by":..,"action":"..""argument":".."}
...
Мне нужно для каждого действия X создавать новую строку с аргументом и датой.
например. У меня есть таблица:
id log
1 {"date":"d1","by":..,"action":"x""argument":"y1"}, {"date":"d2","by":..,"action":"x""argument":"y2"}..
2 {"date":"d3","by":..,"action":"z""argument":"y1"}..
3 {"date":"d4","by":..,"action":"t""argument":"y3"}, {"date":"d5","by":..,"action":"x""argument":"y4"}
Мне нужна таблица, подобная:
id argument date
1 y1 d1
1 y2 d2
3 y4 d5
количество действий в журналах изменяется.
Моя база данных redshift, и я использую Dbeaver.
Я видел запрос, подобный этому:
'SELECT ProductId, Name, value
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ','); '
Но это только для SQL server.
Любая помощь? даже при использовании функций. Спасибо
Комментарии:
1. Redshift на самом деле не подходит для такого типа преобразования. Это должно быть сделано при загрузке базы данных.
Ответ №1:
Вы можете использовать функцию json_extract_path_text в базе данных Amazon Redshift
Я подготовил следующий пример SQL, чтобы продемонстрировать, как использовать json_extract_path_text
create table Logs (
id int, "log" varchar(max)
);
INSERT into Logs select 1, '{"date":"d1","by":"kodyaz.com","action":"x","argument":"y1"}';
INSERT into Logs select 2, '{"date":"d2","by":"eralper.com","action":"y","argument":"y2"}';
select
id,
json_extract_path_text("log", 'argument') as "argument" ,
json_extract_path_text("log", 'date') as "date"
from Logs;
Вывод будет таким, как вам требуется
Комментарии:
1. Спасибо за ваш комментарий. это отлично работает, если у меня есть только один раздел {..}. Но если у меня есть несколько подобных {..},{..},{…} это выдает мне ошибку … вы можете мне помочь с этим?