2016-10-25 3 views
3

Ich habe eine SQL-Tabelle mit DatenSQL SUBSTRING mit Bedingung

 
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 

Ich möchte die OU Server Name ziehen von oben Daten CCG dh - US Fern

select SUBSTRING(distinguished_name,CHARINDEX('OU',distinguished_name), 
LEN(distinguished_name)) from web_ldap_server_user where user_id='STEVE.BROWN' 

ich mit diesem QUERY versucht, aber erwartete Ergebnisse nicht erhalten. Kann mir hier jemand helfen?

+0

Erklären Sie kurz, welche Ausgabe genau Sie brauchen –

+0

Sie haben mehrere OU = Einträge, so dass Ihr CHARINDEX ('OU', distinguished_name) nur die erste findet. – pmbAustin

+1

Das ist extrem unklar, was Sie hier wollen. –

Antwort

0

versuchen, diese Abfrage:

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' 

es den folgenden Wert zurückgeben:

CCG - US Remote (USREM) 

Lesen Sie mehr über String-Funktionen in Stackoverflow Documentation

0
CHARINDEX('OU=Users,OU=',distinguished_name)+12 

Wird diese Position, wenn jedes Feld hat OU=Users,OU= davor.

3

Mit einem Split/Parse Funktion

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 

Returns

user_id  server_id RetSeq RetVal 
STEVE.BROWN SERVER01 3   Users 
STEVE.BROWN SERVER01 4   CCG - US Remote (USREM) 
STEVE.BROWN SERVER01 5   fooUsers 

Nun ist die Frage ... Es gibt 3 "OU =" Werte. Welche Logik wäre erforderlich, um den Server zu identifizieren? Zum Beispiel in der CROSS APPLY derzeit Ich habe Where RetVal Like 'OU=%' aber auch Where RetVal Like 'OU=% - %'

sein könnte oder wenn es immer die 4. Position, ändern Sie die WHERE zu Where RetSeq=4

Die UDF (die sich leicht in die portiert werden könnte, ist CROSS APPLY anstelle einer Funktion)

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) 
); 
0

Unter der Annahme, die Servernamen immer in dem zweiten "OU =" Auftreten ist, dann gilt:

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 

Sie können es kürzer machen, aber hier habe ich es gelegt, damit Sie die Logik in Schritten verstehen können.