Разделить несколько столбцов по разделителю и создать новые строки после соответствующих событий разделения - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть следующая таблица в Postgres

col1                               col2                     col3              col4
antiTB                             96165 | 96166            0.182 | 1         D12491 | D12492   
antiTB | antimaleria | antichol    96168 | 96169 | 96170    0.182 | 1 | 2     D12491 | D12492 | D12493  

Я хотел бы рекурсивно разделить значения столбца на '|' и создайте новые строки со значениями, выбранными после разделения.

Требуемый вывод:

col1                               col2                     col3              col4
antiTB                             96165                    0.182             D12491
antiTB                             96166                    1                 D12492        
antiTB                             96168                    0.182             D12491
antimaleria                        96169                    1                 D12492    
antichol                           96170                    2                 D12493        

Я пробовал следующий запрос:

select distinct t2.col1, t3.col2, t4.col3, t5.col4
from table t1
  cross join lateral unnest(string_to_array(t1.col1,'|')) as t2 (col1)
  cross join lateral unnest(string_to_array(t1.col2,'|')) as t3 (col2)
  cross join lateral unnest(string_to_array(t1.col3,'|')) as t4 (col3)
  cross join lateral unnest(string_to_array(t1.col4,'|')) as t5 (col4)
;

Запрос разбивается значения столбцов, но это создает намного больше строк в выводе. Любое предложение здесь будет очень полезно.

1 Ответ

0 голосов
/ 25 апреля 2020

Вам не нужен CROSS JOIN, который собирается создать декартово произведение. Вам понадобится несколько параллельных unnests с использованием ROWS FROM синтаксиса , которые являются боковыми по отношению к выбору t1. Это даже можно упростить, передав несколько аргументов unnest:

SELECT DISTINCT split.*
FROM t1,
LATERAL unnest(
  string_to_array(t1.col1,'|'),
  string_to_array(t1.col2,'|'),
  string_to_array(t1.col3,'|'),
  string_to_array(t1.col4,'|')
) AS split(col1, col2, col3, col4);
...