小编典典

如何在sql中解析代字号分隔的列以创建多个列?

sql

我有一个表格 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次。

有一个更好的方法吗?

谢谢


阅读 178

收藏
2021-05-16

共1个答案

小编典典

有人很友善地为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;
2021-05-16