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

Your email address will not be published. Required fields are marked *