SQL String函数查找指定值的每次迭代并返回

时间:2016-12-28 20:14:36

标签: sql sql-server sql-server-2008-r2

我试图解析一个特定的字段并只返回一部分字符串。

示例:

我的varchar字段包含以下字符串。

CN=PHLSERVER01,OU=Servers,OU=PHL,OU=Offices,DC=test,DC=test2,DC=office
CN=NYCSFAX01,OU=Servers,OU=NYC,OU=Offices,DC=test,DC=test2,DC=office 
CN=KONGRDATA01,OU=ServersToDelete,DC=test,DC=test2,DC=office 
CN=LAXSERVER01,OU=Servers,OU=LAX,OU=Offices,DC=test,DC=test2,DC=office

我只想查询并返回CN名称(通用名称)。所以在这个例子中,我想看看:

PHLSERVER01,NYCSFAX01,KONGRDATA01,LAXSERVER01

3 个答案:

答案 0 :(得分:1)

借助分割/分析功能(有许多选项)

select p.name from process p, list l
where l.id = 2
  and (p.id in (l.operation1, l.operation2, l.operation3))

返回

Declare @YourTable table (ID int,SomeString varchar(max))
Insert Into @YourTable values
(1,'CN=PHLSERVER01,OU=Servers,OU=PHL,OU=Offices,DC=test,DC=test2,DC=office CN=NYCSFAX01,OU=Servers,OU=NYC,OU=Offices,DC=test,DC=test2,DC=office CN=KONGRDATA01,OU=ServersToDelete,DC=test,DC=test2,DC=office CN=LAXSERVER01,OU=Servers,OU=LAX,OU=Offices,DC=test,DC=test2,DC=office')


Select A.ID
      ,CN = B.RetVal
 From @YourTable A
 Cross Apply (
                Select RetVal=Replace(RetVal,'CN=','')
                 From  (
                        Select RetSeq = Row_Number() over (Order By (Select null))
                              ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                        From  (Select x = Cast('<x>'+ replace((Select Replace(A.SomeString,' ',',') as [*] For XML Path('')),',','</x><x>')+'</x>' as xml).query('.')) as A 
                        Cross Apply x.nodes('x') AS B(i)
                       ) C
                   Where RetVal Like '%CN=%'
             ) B

答案 1 :(得分:0)

如果您使用的是SQL Server 2016,则可以使用STRING_SPLIT将值拆分为逗号字符,然后仅使用CHARINDEX选择那些以CN开头的记录

在早期版本的SQL Server中,您可以编写一个函数来模拟将字符串拆分为表格的STRING_SPLIT,例如,请参阅此帖子https://ole.michelsen.dk/blog/split-string-to-table-using-transact-sql.html

答案 2 :(得分:0)

最直接的解决方案是创建一个表值函数,它接受一个字符串作为输入并返回一个键值对的表。然后只需使用字符串索引函数。

DECLARE @Data NVARCHAR(MAX)
SET @Data='CN=PHLSERVER01,OU=Servers,OU=PHL,OU=Offices,DC=test,DC=test2,DC=office CN=NYCSFAX01,OU=Servers,OU=NYC,OU=Offices,DC=test,DC=test2,DC=office CN=KONGRDATA01,OU=ServersToDelete,DC=test,DC=test2,DC=office CN=LAXSERVER01,OU=Servers,OU=LAX,OU=Offices,DC=test,DC=test2,DC=office'

SELECT * FROM dbo.MyFunctionToConvertDelimitedStringToTable(@Data,',')
WHERE
CHARINDEX('CN',Key)>0