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


Я пытаюсь выполнить следующий поиск строк с помощью Oracle SQL 11g R2:

Данные таковы:

| СN=aXYZApple-Ау,ОУ=управляемый,ОУ=группы В,DC=основной,ДК=реж,ДК=АВС,РС=ком | CN=31107427, OU=списки рассылки, OU=общий доступ Почтовые ящики,постоянного тока=ядро,ДК=реж,ДК=АВС,РС=ком | СN=ea90045052,ОУ=группы,ОУ=eProfile,ДК=ядро,ДК=реж,ДК=АВС,РС=ком | CN=S0901448, OU=списки рассылки, OU=общий доступ Почтовые ящики,постоянного тока=ядро,ДК=реж,ДК=АВС,РС=ком | СN=00900887,ОУ=распределение Списки, OU=общие Почтовые ящики,постоянного тока=ядро,ДК=реж,ДК=АВС,РС=ком | СN=NSMMMM,ОУ=ЛРЗ,ОУ=группы В,DC=ядро,ДЦ=реж,ДК=АВС,РС=ком | СN=aXYZApple-только для чтения,ОУ=управляемый,ОУ=группы В,DC=ядро,ДК=реж,ДК=АВС,РС=ком | СN=WWSWW-Ау,ОУ=ЛРЗ,ОУ=группы В,DC=основной,ДК=реж,ДК=АВС,РС=ком | СN=aLogical_RW,ОУ=управляемый,ОУ=группы В,DC=ядро,ДК=реж,ДК=АВС,РС=ком | СN=aXYZApple-пишите,ОУ=управляемый,ОУ=группы В,DC=ядро,ДК=реж,ДК=АВС,РС=ком |

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

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

aXYZApple-Au
aXYZApple-Readonly
aXYZApple-Write

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

1 2

1 ответ:

Вы могли бы использовать 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.