разделить журнал на отдельные строки redshift

#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. Спасибо за ваш комментарий. это отлично работает, если у меня есть только один раздел {..}. Но если у меня есть несколько подобных {..},{..},{…} это выдает мне ошибку … вы можете мне помочь с этим?