не то, чтобы я был большим фанатом профсоюзов, пока оставив их в покое, его можно заставить работать следующим образом:
with data as (
select * from values (101, '4355|6755', '4355|7866', NULL),
(102, '8566|6755', '8566' , 8566)
v(id, core, primary, secondary)
), exploded as (
SELECT id, 'c' as type, c.value::varchar AS codes
FROM data
,lateral flatten (input => split(core, '|')) c
UNION ALL
SELECT id, 'p' as type, d.value::varchar AS codes
FROM data
,lateral flatten (input => split(primary, '|')) d
UNION ALL
SELECT id, 's' as type, e.value::varchar AS codes
FROM data
,lateral flatten (input => split(secondary, '|')) e
)
select id
,codes
,iff(sum(iff(type='c',1,0))>0,'Y','') as core_ind
,iff(sum(iff(type='p',1,0))>0,'Y','') as primary_ind
,iff(sum(iff(type='s',1,0))>0,'Y','') as secondary_ind
from exploded
group by 1,2
order by 1,2;
это дает:
ID CODES CORE_IND PRIMARY_IND SECONDARY_IND
101 4355 Y Y
101 6755 Y
101 7866 Y
102 6755 Y
102 8566 Y Y Y
так что это также можно сделать с помощью UNPIVOT, а затем FLATTEN, не намного лучше:
with data as (
select * from values (101, '4355|6755', '4355|7866', NULL),
(102, '8566|6755', '8566' , '8566')
v(id, data_a, data_b, data_c)
), unpivoted as (
select *
from data unpivot(code for type in (data_a, data_b, data_c))
), flattened as (
select id, type, f.value as codes
from unpivoted
,lateral flatten (input => split(code, '|')) f
)
select id
,codes
,iff(sum(iff(type='DATA_A',1,0))>0,'Y','') as core_ind
,iff(sum(iff(type='DATA_B',1,0))>0,'Y','') as primary_ind
,iff(sum(iff(type='DATA_C',1,0))>0,'Y','') as secondary_ind
from flattened
group by 1,2
order by 1,2;