Sql server 将逗号分隔的值转换为多列表
我需要将逗号分隔的列表转换为多列表,如果您能帮助我,我将不胜感激 输入Sql server 将逗号分隔的值转换为多列表,sql-server,tsql,Sql Server,Tsql,我需要将逗号分隔的列表转换为多列表,如果您能帮助我,我将不胜感激 输入 [aaa,111],[bbb,222],[ccc,333],[ddd,444] col1 col2 aaa 111 bbb 222 ccc 333 ddd 444 所需输出 [aaa,111],[bbb,222],[ccc,333],[ddd,444] col1 col2 aaa 111 bbb 222 ccc 33
[aaa,111],[bbb,222],[ccc,333],[ddd,444]
col1 col2
aaa 111
bbb 222
ccc 333
ddd 444
所需输出
[aaa,111],[bbb,222],[ccc,333],[ddd,444]
col1 col2
aaa 111
bbb 222
ccc 333
ddd 444
使用字符串拆分函数,首先在
,[
上拆分以获取行。然后在,
上拆分每一行以获取列。如果对帮助程序函数打开
厌倦了提取字符串(左、右、charindex、patindex等),我修改了一个parse/split函数来接受两个不相似的分隔符
示例
Declare @S varchar(max) = '[aaa,111],[bbb,222],[ccc,333],[ddd,444]'
Select Col1 = left(RetVal,NullIf(charindex(',',RetVal),0)-1)
,Col2 = stuff(RetVal,1,NullIf(charindex(',',RetVal),0),'')
From [dbo].[tvf-Str-Extract](@S,'[',']')
返回
Col1 Col2
aaa 111
bbb 222
ccc 333
ddd 444
TVF如果感兴趣
CREATE FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
Returns Table
As
Return (
with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
cte2(N) As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
cte3(N) As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)
Select RetSeq = Row_Number() over (Order By N)
,RetPos = N
,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1)
From (
Select *,RetVal = Substring(@String, N, L)
From cte4
) A
Where charindex(@Delimiter2,RetVal)>1
)
/*
Max Length of String 1MM characters
Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[tvf-Str-Extract] (@String,'[[',']]')
*/
只是为了好玩,试试看
Select * From [dbo].[tvf-Str-Extract](@S,'[',']')
你会得到…然后我们就解析RetVal
RetSeq RetPos RetVal
1 2 aaa,111
2 12 bbb,222
3 22 ccc,333
4 32 ddd,444
有一种非常简单的方法可以直接将其转换为XML:
DECLARE @YourString VARCHAR(100)='[aaa,111],[bbb,222],[ccc,333],[ddd,444]';
--This will do some replacements to transform your string to XML:
SELECT CAST(REPLACE(REPLACE('<x><y>' + REPLACE(REPLACE(@YourString,'],[','</y></x><x><y>'),',','</y><y>') + '</y></x>',']',''),'[','') AS XML);
什么版本的sql server?2016年有内置函数可以轻松实现这一点,SPLIT()sql server 2012,是的,我知道SS 2016中有SPLIT,但无法使用和替换(“[”,“)什么,没有XML?:-)谢谢@shnugo这对我有效,我将尝试在内联函数中测试包装它
Column1 Column2
aaa 111
bbb 222
ccc 333
ddd 444