Wednesday, August 29, 2012

Split Data in Teradata


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: