1

Oracle 11g で REGEXP_SUBSTR を使用していますが、次の文字列を抽出するのに苦労しています。

私のクエリは次のとおりです。

SELECT regexp_substr('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', '[^CN=]*\,', 1, rownum) line
 FROM dual
 CONNECT BY LEVEL <= length('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,') - 
                     length(REPLACE('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', ',', ''))

このクエリから、正確な文字列 'CN=' に一致させようとすると問題が発生します。このクエリから、出力を次のように表示する必要があります。

CN=aTIGERAdmin-Admin,
CN=D0902498,
CN=ea90045052,
CN=aTIGERCall-Admin,

この形式では、最後にカンマがあります。

私が現在行っている方法は、「CN =」を切り落とすことですが、実際にはこの部分が必要です。

4

2 に答える 2

5

これにより、探している結果セットが返されると思います。

SELECT REGEXP_SUBSTR(d.s,'CN=.*?,', 1, ROWNUM) line
  FROM (SELECT 'CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,'
        AS s FROM dual) d
CONNECT BY LEVEL <= LENGTH(d.s) - LENGTH(REPLACE(d.s,',',''))

ここで使用される正規表現のトリックは、?修飾子 ( の後に続く.*) を指定して、一致を「非貪欲」にすることです。デフォルトの一致 (?修飾子なし) は、可能な限り多くの文字列に一致するという点で「貪欲」です。あなたの場合、最初に見つかったコンマで一致を終了させたいと考えています。ここでの意図は、リテラル文字列 'CN=' とそれに続く任意の数の文字 (ゼロ、1 つ以上) を最初のカンマまで一致させることです。

これは、Oracle 10g および 11g で機能します。

11g では、REGEXP_COUNT 関数は、発生の「コマンドのカウント」計算を置き換えることができます。

CONNECT BY LEVEL <= REGEXP_COUNT(d.s,'CN=.*?,')

(ところで...サブクエリを使用してリテラル文字列を返すことにより、リテラル文字列を1回だけ指定する必要があります。これにより、複数の場所で文字列を変更するよりも、テストのために文字列を変更する方がはるかに簡単になります。)


補遺:

戻り値にカンマが含まれていることが確認できました。出力例:

LINE
-----------------------
CN=aTIGERAdmin-Admin,                                                 
CN=D0902498,                                                          
CN=ea90045052,                                                        
CN=aTIGERCall-Admin, 
于 2012-06-25T18:24:41.380 に答える
0

私は LDAP マスターではありませんが、正規表現CN=[^,]+( C、次にN、次に等号、貪欲に複数の非カンマが続く) はうまくいきますか?

REGEXP_COUNTまた、 11gの新機能について知っていますか?

SQL> SELECT REGEXP_SUBSTR('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', 'CN=[^,]+', 1, ROWNUM) line
  2   FROM dual
  3   CONNECT BY LEVEL <= REGEXP_COUNT('CN=aTIGERAdmin-Admin, CN=D0902498, CN=ea90045052, CN=aTIGERCall-Admin,', 'CN=[^,]+')
  4  /

LINE
----------------------------------------------------------------------------------------------------
CN=aTIGERAdmin-Admin
CN=D0902498
CN=ea90045052
CN=aTIGERCall-Admin

SQL>
于 2012-06-25T18:02:03.027 に答える