2016-09-14 39 views
1

我正在使用SQL Server 2014。我有一列中包含文本數據。數據是這樣的:SQL中的字符串操作

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

它的SQL服務器2014 – Remi

回答

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 

樣本輸出:

enter image description here

+0

如果CN談到在最後的位置是什麼。在最終位置我們沒有','分隔符。 – Remi

+0

例如:插入#temp值 ('PN = XYZ,AD = 123,AN = rst,CN = ABCD') – Remi

+0

@remi:只需添加一個case語句,即可處理這種情況。請使用更新的代碼。 –

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元素爲字符串的最後一個元素。

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%' 
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 
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 
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')