我有一个表格 TableA, 其中一个由波浪号操作的列 ColumnA
表A
**ColumnA** 123~abc~def~~~~~ghi~j~k~lmn~op~~~ 231~a~dfg~wer~~~~~~~hijkl~~~
正如我们在以上两行中看到的那样,它用’〜’分隔。我基本上想将值分成单独的列。有15个’〜’运算符。
我的输出表应该是这样的
Col1 Col2 Col3 Col4 . . .. . . .. .. .. .. . 123 abc def . .. . .. .. ... .. . . .
我在DB2中有一个查询,它将执行此操作,但是由于有15个“〜”运算符,因此需要15个子查询才能完成此任务。如下:
SELECT substr(ColumnA, 1, LOCATE('~', ColumnA)-1) AS Col1, substr(ColumnA, charindex('~', ColumnA)+1, LEN(ColumnA)) AS Other FROM TableA
我仅通过以上查询来分隔Col1。如果希望分隔15列,则必须对此子查询15次。
有一个更好的方法吗?
谢谢
有人很友善地为DB2编写了此拆分功能
http://www.mcpressonline.com/sql/techtip-create-an-sql-function-to-split-a- delimited-list.html
CREATE FUNCTION QGPL.SPLIT ( @Data VARCHAR(32000), @Delimiter VARCHAR(5)) RETURNS TABLE ( ID INT, VALUE VARCHAR(256)) LANGUAGE SQL DISALLOW PARALLEL DETERMINISTIC NOT FENCED RETURN WITH CTE_Items (ID,StartString,StopString) AS ( SELECT 1 AS ID ,1 AS StartString ,LOCATE(@Delimiter, @Data) AS StopString FROM SYSIBM.SYSDUMMY1 WHERE LENGTH(@Delimiter)>0 AND LENGTH(@Data)>0 UNION ALL SELECT ID + 1 ,StopString + LENGTH(@Delimiter) ,LOCATE(@Delimiter, @Data, StopString + LENGTH(@Delimiter)) FROM CTE_Items WHERE StopString > 0 ) SELECT ID, SUBSTRING(@Data,StartString, CASE WHEN StopString=0 THEN LENGTH(@Data) ELSE StopString-StartString END) FROM CTE_Items;