我有记录,有时带有一个文本和一个数字,有时带有两个、三个或四个,它们用两个点“:”分隔。我想将数字和文本拆分为多列。
这里是一个记录示例: 3月:4月1日:5月2日:6月10日:1
想要的结果:
Str_1 | item_1 | Str_2 | 项目_2 | Str_3 | 项目_3 | Str_4 | item_4 |
---|---|---|---|---|---|---|---|
三月 | 1 | 四月 | 2 | 五月 | 10 | 六月 | 1 |
我正在使用 SQL SERVER 2012
我制作了这个脚本,但它并不适用于所有情况
select substring(@str,1,charindex(':',@str)-1) as str_Type,
case when len(@str)-len(replace(@str,':',''))=1 then substring(@str,charindex(':',@str)+1,len(@str))
else substring(ltrim(
SUBSTRING(
substring(replace
(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,1
,CHARINDEX(':',substring(replace
(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,
LEN(replace(@str,'-',''))))-1))
,1
,charindex(' ',ltrim(SUBSTRING(
substring(replace(
@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,1
,CHARINDEX(':',substring(replace
(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,
LEN(replace(@str,'-',''))))-1)))-1)
end as str_Unit,
case when len(@str)-len(replace(@str,':',''))=1 then null
else substring(ltrim(SUBSTRING(
substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-','')))
,1
,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))-1))
,charindex(' ',ltrim(SUBSTRING(substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))) ,1,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))-1)))+1
,len(ltrim(SUBSTRING(substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))) ,1,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))-1))))
end as str_type_2 ,
LEFT(case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-','')))))
End, PATINDEX('%[0-9][^0-9]%', case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-','')))))
End )) as str_Unit_2,
case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,len(ltrim(SUBSTRING(substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))) ,1,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))-1))))))
End as str_type_3,
reverse(LEFT(reverse(LEFT(case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end, PATINDEX('%[0-9][^0-9]%', case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end ))), PATINDEX('%[0-9][^0-9]%', reverse(LEFT(case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end, PATINDEX('%[0-9][^0-9]%', case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end ))) ))) str_Unit_3,
replace(LTRIM(RIGHT( case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end, LEN( case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end) - PATINDEX('%[0-9][^0-9]%', case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end ))),reverse(LEFT(reverse(LTRIM(RIGHT( case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end, LEN( case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end) - PATINDEX('%[0-9][^0-9]%', case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end )))), PATINDEX('%[0-9][^0-9]%', reverse(LTRIM(RIGHT( case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end, LEN( case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end) - PATINDEX('%[0-9][^0-9]%', case when len(@str)-len(replace(@str,':',''))=1 then null
else SUBSTRING(
substring(replace
(@str,'-',''),
PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
LEN(replace(@str,'-','')))
,CHARINDEX(':',substring(replace(@str,'-',''),
CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
,CHARINDEX(':',replace(@str,'-',''))+1
,LEN(replace(@str,'-',''))))) end )))) )+2)),'') str_Type_4,
substring( @str,DATALENGTH(@str)-CHARINDEX(REVERSE(':'),REVERSE(@str))+3,len(@str)) as str_Unit_4
Thanks!
我不确定那一大堆乱七八糟的代码应该做什么,但你可以使用
OPENJSON
和一些字符串替换来分割你的文本:
DECLARE @str varchar(max) = 'Text1 : 1 Text2 : 2 Text3 : 10 Text4 : 1';
SELECT
j.[key],
LEFT(j.value, v.pipe - 1),
SUBSTRING(j.value, v.pipe + 1, LEN(j.value))
FROM OPENJSON(
'["' +
REPLACE(
REPLACE(
@str,
' : ',
'|'
),
' ',
'","'
)
+ '"]'
) j
CROSS APPLY (VALUES (
CHARINDEX('|', j.value)
) ) v(pipe);
如果您希望将其放在一行上,则可以将其聚合。