CREATE TABLE INDRAGUN.TEST_X (
DELIMITED_STRING VARCHAR(100)
);
INSERT INTO INDRAGUN.TEST_X VALUES ('1 | A, B, C');
INSERT INTO INDRAGUN.TEST_X VALUES ('2 | A, B, C,D');
WITH RECURSIVE PARSE_LIST (RESPONSE_KEY, DELIM_POS, ITEM_NUM, ELEMENT, REMAINDER) AS
(
SELECT
SUBSTRING( DELIMITED_STRING FROM 1 FOR POSITION('|' IN DELIMITED_STRING))
,0, 0, CAST('' AS VARCHAR(100))
,SUBSTRING(DELIMITED_STRING FROM POSITION('|' IN DELIMITED_STRING)+2 FOR CHAR_LENGTH(DELIMITED_STRING))
FROM
INDRAGUN.TEST_X
UNION ALL
SELECT RESPONSE_KEY,
CASE WHEN POSITION(',' IN REMAINDER) > 0
THEN POSITION(',' IN REMAINDER)
ELSE CHARACTER_LENGTH(REMAINDER) END DPOS,
ITEM_NUM + 1,
TRIM(BOTH ',' FROM SUBSTR(REMAINDER, 0, DPOS+1)),
TRIM(SUBSTR(REMAINDER, DPOS+1))
FROM PARSE_LIST
WHERE DPOS > 0
)
SELECT RESPONSE_KEY, ELEMENT
FROM PARSE_LIST P
WHERE ITEM_NUM > 0
ORDER BY RESPONSE_KEY, ITEM_NUM;
---RESULT
RESPONSE_KEY ELEMENT
1 | A
1 | B
1 | C
2 | A
2 | B
2 | C
2 | D
No comments:
Post a Comment