我有一个带数据的SQL表
user_id server_id distinguished_name STEVE.BROWN SERVER01 CN=Brown\, Steve N.,OU=Users,OU=CCG - US Remote (USREM),OU=fooUsers,DC=amer,DC=foo,DC=com
我想从上面的数据中提取OU服务器名称,即CCG - US Remote
select SUBSTRING(distinguished_name,CHARINDEX('OU',distinguished_name),
LEN(distinguished_name)) from web_ldap_server_user where user_id='STEVE.BROWN'
我试过这个QUERY但没有得到预期的结果。谁能在这帮助我?
答案 0 :(得分:3)
使用任何分割/分析功能
Select A.user_id
,A.server_id
,B.*
From YourTable A
Cross Apply (Select RetSeq,RetVal=Replace(RetVal,'OU=','')
From [dbo].[udf-Str-Parse](A.distinguished_name,',')
Where RetVal Like 'OU=%'
) B
返回
user_id server_id RetSeq RetVal
STEVE.BROWN SERVER01 3 Users
STEVE.BROWN SERVER01 4 CCG - US Remote (USREM)
STEVE.BROWN SERVER01 5 fooUsers
现在的问题是......有3" OU ="值。识别服务器需要什么逻辑?例如,在CROSS APPLY中,我目前有Where RetVal Like 'OU=%'
,但这也可能是Where RetVal Like 'OU=% - %'
如果它始终是第4个位置,请将WHERE更改为Where RetSeq=4
UDF(可以很容易地移植到CROSS APPLY而不是函数中)
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
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(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
答案 1 :(得分:0)
尝试此查询:
SELECT SUBSTRING(SUBSTRING(distinguished_name,CHARINDEX('OU=',distinguished_name,CHARINDEX('OU=',distinguished_name) + 1) +
3,LEN(distinguished_name)),1,CHARINDEX(',',SUBSTRING(distinguished_name,CHARINDEX('OU=',distinguished_name,CHARINDEX('OU=',distinguished_name) + 1) +
3,LEN(distinguished_name))) - 1) from web_ldap_server_user where user_id='STEVE.BROWN'
它返回以下值:
CCG - US Remote (USREM)
中有关字符串函数的更多信息
答案 2 :(得分:0)
CHARINDEX('OU=Users,OU=',distinguished_name)+12
如果每个字段前面都有OU=Users,OU=
,则会获得该位置。
答案 3 :(得分:0)
假设服务器名称始终位于第二个&#34; OU =&#34;发生,然后:
select SUBSTRING(r.disName, 4, charindex(',', r.disName) - 4)
from (
select SUBSTRING(s.disName, charindex('OU=', s.disName), LEN(s.disName)) as disName
from (
select SUBSTRING(distinguished_name, CHARINDEX('OU=',distinguished_name) + 3, LEN(distinguished_name)) as disName
from web_ldap_server_user where user_id='STEVE.BROWN'
) s
) r
你可以缩短它,但在这里我已经奠定了它,所以你可以逐步理解逻辑。