带条件的SQL SUBSTRING

时间:2016-10-25 18:29:18

标签: sql sql-server

我有一个带数据的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但没有得到预期的结果。谁能在这帮助我?

4 个答案:

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

阅读Stackoverflow Documentation

中有关字符串函数的更多信息

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

你可以缩短它,但在这里我已经奠定了它,所以你可以逐步理解逻辑。