sql server:利用内置函数fn_split 实现拆分为多行,字符串中间的分隔符必须统一
select a.id,cast(b.value as varchar(20))
from aaa a
CROSS apply dbo.fn_split (idea,',',0) b
如果库里面这个函数,可以新建表值函数fn_split:
CREATE FUNCTION [dbo].[fn_split] ( @String NVARCHAR(MAX) ,
@Str NVARCHAR(20),
@distinct BIT )
RETURNS @table TABLE ( Value NVARCHAR(MAX),orders int)
AS
BEGIN
DECLARE @i INT ,
@j INT ,
@l INT ,
@v NVARCHAR(MAX),
@orders int
SET @i = 0
SET @j = 0
SET @l = LEN(@String)
set @orders=1
WHILE ( @j < @l )
BEGIN
SET @j = CHARINDEX(@Str, @String, @i + 1)
IF @j = 0
SET @j = @l + 1
SET @v = SUBSTRING(@String, @i + 1, @j - @i - 1 )
IF @v <> '' AND (@distinct = 0 OR NOT EXISTS (SELECT 1 FROM @table WHERE Value = @v))
INSERT INTO @table
VALUES ( LTRIM(RTRIM(@v)),@orders)
SET @i = @j + LEN(@Str) - 1
set @orders=@orders+1
END
RETURN
END
with tempHobbys as (select Name,Hobby,charindex(',',Hobby)-1 endindex,0 startindex from Hobbys
union all select Name,Hobby,charindex(',',Hobby,endindex+2)-1 endindex,endindex+2 startindex from tempHobbys where endindex>-1),with tempHobbys 2 as (select Name,Hobby,(case when endindex<0 then len(Hobby) else Hobby end) endindex,startindex from tempHobbys)select Name,substring(Hobby,startindex,endindex-startindex+1) Hobby from tempHobbys2