我试图解析一个特定的字段并只返回一部分字符串。
示例:
我的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
答案 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