19

私はこの声明の理解を得ることができません - グーグルで検索しても理解できません

 
pv_no_list :='23,34,45,56';
SELECT   DISTINCT REGEXP_SUBSTR (pv_no_list,
                                                     '[^,]+',
                                                     1,
                                                     LEVEL)
                                         no_list
                      FROM   DUAL
                CONNECT BY   REGEXP_SUBSTR (pv_no_list,
                                            '[^,]+',
                                            1,
                                            LEVEL) IS NOT NULL

4

3 に答える 3

28

の「乱用」(Colin 't Hart が言ったように) にconnected byは、ここで良い目的があります: を使用REGEXP_SUBSTRすると、4 つの一致 (23,34,45,56) のうちの 1 つだけを抽出できます: 正規表現[^,]+は、文字列内の任意の文字シーケンスに一致します。コンマを含まない。

実行してみる場合:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token" 
FROM   DUAL

あなたが得るでしょう23

実行してみる場合:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM   DUAL

また、 2 つの追加パラメーター23も設定します。位置 1 (デフォルト) から検索を開始し、最初に出現したものを返します。

実行してみましょう:

SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM   DUAL

今回は34(2 番目のオカレンス) を取得3し、最後のパラメーターとして使用して戻ります45

connected byとともにrecursive を使用するとlevel、関連するすべての結果を確実に受け取ることができます (必ずしも元の順序であるとは限りません!):

SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
FROM   DUAL
CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
order by 1

戻ります:

TOKEN
23
34
45
56

これには 4 つの結果がすべて含まれているだけでなく、結果セット内の別々の行に分割されています!

それをいじってみると、主題のより明確な見方が得られるかもしれません。

于 2013-10-05T08:05:22.800 に答える
6

connect byとは何の関係もありませんregex_substr:

  • 1 つ目は、階層クエリを実行することです。http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm を参照してください

  • 2 つ目は、正規表現を使用して部分文字列を取得することです。

connect byこのクエリは、 のクエリで行を生成する機能を「悪用」しますdual。に渡された式が true である限りconnect by、新しい行が生成され、疑似列の値が増加しますLEVEL

次に、正規表現を適用するときに n 番目の値を取得するために にLEVEL渡されます。regex_substr

于 2013-10-05T07:54:11.500 に答える