Solution using regexp split to table
SELECT
split_d.id AS id
,split_d.seq AS seq
,TRIM(split_d.country) AS country_code
FROM
(
SELECT * FROM (SELECT 1 AS id, 'CZ,DE ,US' AS country) a1
UNION ALL
SELECT * FROM (SELECT 2 AS id, 'BE,NL ,LU' AS country) a2
UNION ALL
SELECT * FROM (SELECT 3 AS id, 'CA' AS country) a3
UNION ALL
SELECT * FROM (SELECT 4 AS id, ',' AS country) a4
UNION ALL
SELECT * FROM (SELECT 5 AS id, ' ' AS country) a5
) countrytab,
TABLE(REGEXP_SPLIT_TO_TABLE(countrytab.id, countrytab.country,',','i') RETURNS (id INTEGER, seq INTEGER, country VARCHAR(100))) AS split_d
WHERE countrytab.id = split_d.id
ORDER BY 1,2,3
;
Solution usineg SQL WITH RECURSIVE
WITH RECURSIVE CountryCodes AS (
SELECT
ID,
TRIM(
CASE
WHEN POSITION(',' IN country) > 0
THEN SUBSTRING(country FROM 1 FOR POSITION(',' IN country) - 1)
ELSE country
END
) AS country_code,
TRIM(
CASE
WHEN POSITION(',' IN country) > 0
THEN SUBSTRING(country FROM POSITION(',' IN country) + 1)
ELSE ''
END
) AS remaining_codes
FROM
(
SELECT * FROM (SELECT 1 AS id, 'CZ,DE ,US' AS country) a1
UNION ALL
SELECT * FROM (SELECT 2 AS id, 'BE,NL ,LU' AS country) a2
UNION ALL
SELECT * FROM (SELECT 3 AS id, 'CA' AS country) a3
UNION ALL
SELECT * FROM (SELECT 4 AS id, ',' AS country) a4
UNION ALL
SELECT * FROM (SELECT 5 AS id, ' ' AS country) a5
) AS countrytab
WHERE country IS NOT NULL
UNION ALL
SELECT
ID,
TRIM(
CASE
WHEN POSITION(',' IN remaining_codes) > 0
THEN SUBSTRING(remaining_codes FROM 1 FOR POSITION(',' IN remaining_codes) - 1)
ELSE remaining_codes
END
),
TRIM(
CASE
WHEN POSITION(',' IN remaining_codes) > 0
THEN SUBSTRING(remaining_codes FROM POSITION(',' IN remaining_codes) + 1)
ELSE ''
END
)
FROM CountryCodes
WHERE TRIM(remaining_codes) <> ''
)
SELECT id, country_code
FROM CountryCodes
ORDER BY 1,2
;


Leave a Reply