sql >> データベース >  >> RDS >> Oracle

varchar2()ですべての一致を検索します

    素晴らしい質問です! これがフィドルです 一致を結果セットに照会する方法を示しています。

    そして、フィドルのクエリが意味をなさない場合の長い説明があります:)

    RegEx_Testという名前のテーブルを使用しています 列MyVal 。表の内容は次のとおりです。

    MyVal
    ------------------------------
    [A1][abc][B23][D123]a33[bx5]
    [Z15][ax0][B0][F13]R3
    [X215][A3A][J99]F33F33G24[43][R3]
    [Z99][c1][F3][d33]3x24[Y3][f13]
    [9a][D41][Q39][XX12]B27[T03][J12]
    

    全体を通しての正規表現は次のとおりです:\[[[:alpha:]][[:digit:]]{1,2}\] 。 POSIX :alpha:を除いて、他の回答と同じです。 および:digit: 国際的なキャラクターセットの場合により安全な指標。

    まず、任意の行の一致の最大数を知る必要があります。 REGEXP_COUNTを使用します このために:

    SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
      FROM Regex_Test
    
    MAX(REGEXP_COUNT(My...
    ----------------------
                         6
    

    その最大カウントを使用して、「カウンター」テーブル(SELECT ... FROM DUAL)を取得します。 以下)、REGEXP_SUBSTRを使用して値をプルするクエリでカウンターテーブルを相互結合します 。 REGEXP_SUBSTR 「occurrence」パラメータがあり、Counterを使用します :

    SELECT
      MyVal,
      Counter,
      REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
    FROM Regex_Test
    CROSS JOIN (
       SELECT LEVEL Counter
       FROM DUAL
       CONNECT BY LEVEL <= (
         SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
         FROM Regex_Test)) Counters
    

    これが私のテーブルに対する実行例です(部分的な結果):

    MyVal                              Counter Matched
    ---------------------------------- ------- -------
    [9a][D41][Q39][XX12]B27[T03][J12]        1 [D41]
    [9a][D41][Q39][XX12]B27[T03][J12]        2 [Q39]
    [9a][D41][Q39][XX12]B27[T03][J12]        3 [T03]
    [9a][D41][Q39][XX12]B27[T03][J12]        4 [J12]
    [9a][D41][Q39][XX12]B27[T03][J12]        5
    [9a][D41][Q39][XX12]B27[T03][J12]        6
    [A1][abc][B23][D123]a33[bx5]             1 [A1]
    [A1][abc][B23][D123]a33[bx5]             2 [B23]
    [A1][abc][B23][D123]a33[bx5]             3
    ... and so on - total is 30 rows
    

    この時点で、個々の一致の結果セットに加えて、行の最大一致数より少ないnullがあります。試合にはまだ周囲の括弧があります。 nullを除外して角かっこを削除する外部クエリで全体を囲むと、最終的なリストが作成されます。

    SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
      SELECT
        MyVal,
        Counter,
        REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
      FROM Regex_Test
      CROSS JOIN (
         SELECT LEVEL Counter
         FROM DUAL
         CONNECT BY LEVEL <= (
           SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
           FROM Regex_Test)) Counters
    ) WHERE Matched IS NOT NULL
    

    これはFiddleにあるクエリであり、別のクエリで使用できます。



    1. ローカルMYSQLDBをリモートDBサーバーに移動する方法

    2. SQLクエリ:特定の時間間隔中にアクティブだったすべてのIDのリストで、開始時刻でソートされています

    3. 列名を持つ複数の列の最大値?

    4. MySQLフィールドDATETIMEはISO8601を切り捨てます