【问题标题】:Retrieving certain strings within a string using Oracle SQL使用 Oracle SQL 检索字符串中的某些字符串
【发布时间】:2012-02-24 23:50:43
【问题描述】:

我正在使用 Oracle SQL 11g R2 尝试以下字符串搜索:

数据是:

| CN=aXYZApple-Au,OU=Managed,OU=Groups,DC=core,DC=dir,DC=abc,DC=com | CN=31107427,OU=分发列表,OU=共享 邮箱,DC=core,DC=dir,DC=abc,DC=com | CN=ea90045052,OU=Groups,OU=eProfile,DC=core,DC=dir,DC=abc,DC=com | CN=S0901448,OU=分发列表,OU=共享 邮箱,DC=core,DC=dir,DC=abc,DC=com | CN=00900887,OU=分布 Lists,OU=Shared Mailboxes,DC=core,DC=dir,DC=abc,DC=com | CN=NSMMMM,OU=LRP,OU=组,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 |

从上面的数据中,我需要获取所有包含字符串“aXYZApple”的字符串,仅将“OU=Managed”作为该字符串匹配的第二部分。

因此,基于上述,以下结果是我所追求的,并且只会显示:

aXYZApple-Au
aXYZApple-Readonly
aXYZApple-Write

我正在使用 Oracle regexp_like/regexp_replace。

【问题讨论】:

    标签: sql regex oracle plsql


    【解决方案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的相关部分。

    【讨论】:

    • 感谢您,但只是想知道您是否可以简要说明您的查询正在做什么 - 非常感谢。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多