我有一张 TableA 表格,其中包含波浪线操作列 ColumnA
TableA
**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次子查询。
有更好的方法吗?
谢谢
答案 0 :(得分:2)
有人为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;