我正在使用 SQL server 2014 。我有一个包含文本数据的列。数据看起来像这样:
create table #temp
(
stringdata varchar(100) NULL
)
insert into #temp values
('CN=ABCD,PN=XYZ,AD=123,AN=rst'),
('AN=ABC,PN=XYZ,CN=12,AN=rst'),
('AN=ABC,CN=XYZ,PN=123,AN=rst'),
('AN=ABC,AN=XYZ,CN=1234567,PN=rst')
我需要为CN
映射的结果集值。
我尝试使用以下查询提取数据:
select substring(stringdata,charindex('CN=',stringdata),charindex(',',stringdata)-1),*
from #temp
但问题是它需要逗号值的第一个索引。我无法提供正确的长度。
是否有任何简单的查询来获取数据?
答案 0 :(得分:1)
如果总有4个元素用逗号分隔,则可以使用这个棘手的查询:
SELECT REPLACE(sdata,'CN=','')
FROM (
SELECT PARSENAME(REPLACE(stringdata,',','.'),1) as sdata
FROM #temp
UNION
SELECT PARSENAME(REPLACE(stringdata,',','.'),2)
FROM #temp
UNION
SELECT PARSENAME(REPLACE(stringdata,',','.'),3)
FROM #temp
UNION
SELECT PARSENAME(REPLACE(stringdata,',','.'),4)
FROM #temp
) p
WHERE sdata LIKE 'CN=%'
输出:
ABCD
12
XYZ
1234567
答案 1 :(得分:1)
以下是使用SUBSTRING
进行拆分的方法。
SELECT SUBSTRING(stringdata,CHARINDEX ('CN=',stringdata)+3
,CASE WHEN CHARINDEX (',',SUBSTRING(stringdata,CHARINDEX ('CN=',stringdata)+3,LEN(stringdata)))=0 THEN LEN(stringdata)-1
ELSE CHARINDEX (',',SUBSTRING(stringdata,CHARINDEX ('CN=',stringdata)+3,LEN(stringdata)))-1 END)
FROM #temp
示例输出:
答案 2 :(得分:0)
字符串操作在SQL Server中很痛苦。有时我发现OUTER APPLY
可以提供帮助:
select t.stringdata, t3.sd2 as cn
from #temp t outer apply
(select stuff(stringdata, 1, charindex('CN=', stringdata), '') as sd1
) t2 outer apply
(select left(sd1 + ',', charindex(',', sd1 + ',')) as sd2
) t3
当然,如果CN=
不在字符串中,这会变得更加复杂。 + ','
是允许CN
元素成为字符串的最后一个元素。
答案 3 :(得分:0)
你也可以尝试这个:
WITH Xmls AS
(
SELECT CONVERT(xml,'<a>'+REPLACE(stringdata,',','</a><a>')+'</a>') Col FROM #temp
)
SELECT N.value('.', 'varchar(100)')
FROM Xmls
CROSS APPLY Col.nodes('a') T(N)
WHERE N.value('.', 'varchar(100)') LIKE 'CN%'
答案 4 :(得分:0)
在解析器和CROSS APPLY的帮助下,可能是以下
Select A.*
,B.Key_PS
,Key_Value=Replace(B.Key_Value,'CN=','')
from #Temp A
Cross Apply (Select * From [dbo].[udf-Str-Parse] (A.stringdata,',') Where Key_Value like 'CN=%') B
返回
stringdata Key_PS Key_Value
CN=ABCD,PN=XYZ,AD=123,AN=rst 1 ABCD
AN=ABC,PN=XYZ,CN=12,AN=rst 3 12
AN=ABC,CN=XYZ,PN=123,AN=rst 2 XYZ
AN=ABC,AN=XYZ,CN=1234567,PN=rst 3 1234567
如果需要,解析器
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
Return
End
答案 5 :(得分:0)
我认为您要插入的内容是这样的:
insert into #temp values
('CN=ABCD','PN=XYZ','AD=123','AN=rst'),
('AN=ABC','PN=XYZ','CN=12','AN=rst'),
('AN=ABC','CN=XYZ','PN=123','AN=rst'),
('AN=ABC','AN=XYZ','CN=1234567','PN=rst')