SQL SERVER 一行按照某个由分隔符拼接的字段拆分成多行
数据库应用系统经常会遇到,某个字段存储通过分隔符来连接键值字符串,例如下表FileHistory 结构中列:Keywords
我们可能在某些业务场景下转换成以下形式:
首先,创建sql 函数,将拼接的字符串拆分成table
CREATE FUNCTION [dbo].[UF_SplitStringToTable]( @sInputList VARCHAR(MAX) -- List of delimited items , @sDelimiter VARCHAR(20) = ',' -- delimiter that separates items ) RETURNS @List TABLE (item VARCHAR(50)) BEGIN DECLARE @sItem VARCHAR(MAX) WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 BEGIN SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) IF LEN(@sItem) > 0 INSERT INTO @List SELECT @sItem END IF LEN(@sInputList) > 0 INSERT INTO @List SELECT @sInputList -- Put the last item in RETURN END GO
然后,利用cross apply 将表FileHistory 和由此表列:keywords 通过UF_SplitStringToTable(FileHistory.keywords)的派生表连接生成想要的拆分结果。
具体代码如下:
SELECT t1.[Id] ,t1.[Keywords] ,t1.[FileName] ,t1.[FileExtension] ,t1.[CreatedUser] ,t1.[CreatedTime] ,t1.[ImportType] ,i.item as keyword FROM FileHistory t1 OUTER APPLY UF_SplitStringToTable(t1.Keywords, ',') i
成功执行代码后,返回如下结果:
这样,就完成我们需要的结果啦~
2015,fighting for myself,my dear darling,my family, ~O(∩_∩)O~。