Получение определенных строк в строке с использованием Oracle SQL

Надеясь, кто-то может помочь в следующем строчном поиске, используя Oracle sql 11g R2:

Данные:

| CN = aXYZApple-Au, OU = управляемый, OU = группы, DC = ядро, DC = dir, DC = abc, DC = com | CN = 31107427, OU = Списки рассылки, OU = Общие почтовые ящики, DC = ядро, DC = dir, DC = abc, DC = com | CN = ea90045052, OU = Группы, OU = eProfile, DC = core, DC = dir, DC = abc, DC = com | CN = S0901448, OU = Списки рассылки, OU = Общие почтовые ящики, DC = ядро, DC = dir, DC = abc, DC = com | CN = 00900887, OU = Списки рассылки, OU = Общие почтовые ящики, DC = ядро, DC = dir, DC = abc, DC = com | CN = NSMMMM, OU = LRP, OU = Группы, DC = сердечник, DC = dir, DC = abc, DC = com | CN = aXYZApple-Readonly, OU = управляемый, OU = группы, DC = ядро, DC = dir, DC = abc, DC = com | CN = WWSWW-Au, OU = LRP, OU = Группы, DC = сердечник, DC = dir, DC = abc, DC = com | CN = aLogical_RW, OU = Управляемый, OU = Группы, DC = ядро, DC = dir, DC = abc, DC = com | CN = aXYZApple-Write, OU = Managed, OU = Groups, DC = core, DC = dir, DC = abc, DC = com |

Из приведенных выше данных мне нужно получить все строки, которые содержат строку «aXYZApple» только с «OU = Managed», как вторая часть этого совпадения строк.

Поэтому, основываясь на вышесказанном, следующие результаты – это то, что мне нужно, и будет отображаться только:

aXYZApple-Au aXYZApple-Readonly aXYZApple-Write 

Я использую oracle regexp_like / regexp_replace.

Вы можете использовать regexp_substr для разделения ваших входных данных на строки, а затем искать соответствующие строки, например:

 SQL> SELECT regexp_substr(line, 'aXYZApple[^,]*') subtxt 2 FROM (SELECT regexp_substr(:x, '[^|]*\|', 1, rownum + 1) line 3 FROM dual 4 CONNECT BY LEVEL <= length(:x) - length(REPLACE(:x, '|', ''))) 5 WHERE regexp_substr(line || ',', '[^,]*,', 1, 2) = 'OU=Managed,' 6 AND line LIKE '%aXYZApple%'; SUBTXT -------------------------------------------------------------------------------- aXYZApple-Au aXYZApple-Readonly aXYZApple-Write 

Вот небольшое объяснение. Вам нужно пройти шаг за шагом.

Внутренняя часть запроса будет проходить через ваши данные (для каждого | ):

 SQL> SELECT regexp_substr(:x, '[^|]*\|', 1, rownum + 1) line 2 FROM dual 3 CONNECT BY LEVEL <= length(:x) - length(REPLACE(:x, '|', '')); LINE -------------------------------------------------------------------------------- CN=aXYZApple-Au,OU=Managed,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | CN=31107427,OU=Distribution Lists,OU=Shared Mailboxes,DC=core,DC=dir,DC=abc,DC= CN=ea90045052,OU=Groups,OU=eProfile,DC=core,DC=dir,DC=abc,DC=com | CN=S0901448,OU=Distribution Lists,OU=Shared Mailboxes,DC=core,DC=dir,DC=abc,DC= CN=00900887,OU=Distribution Lists,OU=Shared Mailboxes,DC=core,DC=dir,DC=abc,DC= CN=NSMMMM,OU=LRP,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | CN=aXYZApple-Readonly,OU=Managed,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | CN=WWSWW-Au,OU=LRP,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | CN=aLogical_RW,OU=Managed,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | CN=aXYZApple-Write,OU=Managed,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | 

Затем вы должны выполнить цикл для строки OU=Managed во второй позиции:

 SQL> SELECT regexp_substr(line || ',', '[^,]*,', 1, 2) second_part 2 FROM (SELECT regexp_substr(:x, '[^|]*\|', 1, rownum + 1) line 3 FROM dual 4 CONNECT BY LEVEL <= length(:x) - length(REPLACE(:x, '|', ''))); SECOND_PART -------------------------------------------------------------------------------- OU=Managed, OU=Distribution Lists, OU=Groups, OU=Distribution Lists, OU=Distribution Lists, OU=LRP, OU=Managed, OU=LRP, OU=Managed, OU=Managed, 

Наконец, выберите соответствующую часть с последним regexp_substr .