SQL中的字符串操作

时间:2016-09-14 12:21:15

标签: sql sql-server tsql sql-server-2014

我正在使用 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

但问题是它需要逗号值的第一个索引。我无法提供正确的长度。

是否有任何简单的查询来获取数据?

6 个答案:

答案 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

示例输出:

enter image description here

答案 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')