Получение определенных строк внутри строки с помощью 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 ответ:
Вы могли бы использовать
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
.