Quantcast
Channel: SCN : Document List - SAP HANA and In-Memory Computing
Viewing all articles
Browse latest Browse all 1183

Convert CSV string to table

$
0
0

Hi folks,

 

I've seen two use cases and heard of many more where developers need to convert comma-delimited strings into table representation.

 

Following is an example of how to accomplish this with a stored procedure. When evaluating your use case, consider where or not this can be done at the app-server level.

 

Cheers,

Jody

 

 

DROP TYPE T_CSV_ITAB;
CREATE TYPE T_CSV_ITAB AS TABLE (PARSED_VAL NVARCHAR(5000));
DROP PROCEDURE CSV_STRING_TO_ITAB;
CREATE PROCEDURE CSV_STRING_TO_ITAB
(
 IN DELIM_STRING NVARCHAR(5000),
 IN DELIM_CHAR NCHAR(1),
 OUT OUT_TABLE T_CSV_ITAB 
) 
LANGUAGE SQLSCRIPT READS SQL DATA WITH RESULT VIEW CSV_ITAB 
AS 
V_DELIM_STRING NVARCHAR(2000);
V_DELIM_CHAR NVARCHAR(10) := ',';
PARSED_VALUE NVARCHAR(100);
V_DELIM_STR NVARCHAR(10) := ':';
BEGIN 
-- get delimiter
IF :DELIM_CHAR != '' THEN
 V_DELIM_CHAR := :DELIM_CHAR;
END IF;
-- remove leading/trailing whitespace
V_DELIM_STRING := TRIM(:DELIM_STRING) || TRIM(:V_DELIM_CHAR);
-- get the first value
OUT_TABLE = 
 SELECT SUBSTR_BEFORE(:V_DELIM_STRING, :V_DELIM_CHAR) AS PARSED_VAL
 FROM DUMMY; 
-- get the remaining string
V_DELIM_STRING := SUBSTR_AFTER(:V_DELIM_STRING, :V_DELIM_CHAR);
-- parse out the values
WHILE :V_DELIM_STRING != '' DO 
 a =  SELECT SUBSTR_BEFORE(:V_DELIM_STRING, :V_DELIM_CHAR) AS PARSED_VAL  FROM DUMMY;   
 -- build the table 
 OUT_TABLE = SELECT * FROM :a UNION ALL SELECT * FROM :OUT_TABLE;
 V_DELIM_STRING := SUBSTR_AFTER(:V_DELIM_STRING, :V_DELIM_CHAR);    
END WHILE;
END;

-- usage demo
DROP PROCEDURE CSV_TESTER;
CREATE PROCEDURE CSV_TESTER AS
TEST_STRING NVARCHAR(100) := 'A,B,C';
DELIMITER NCHAR(1) := ','; 
BEGIN 
 CALL CSV_STRING_TO_ITAB(:TEST_STRING, :DELIMITER, a);
 
 SELECT * FROM :a;
END;

CALL CSV_TESTER;

Viewing all articles
Browse latest Browse all 1183

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>