2016-06-21 18 views
0

2サンプルのコードのことで接続:PL/SQL、正規表現、

 WITH A AS 
    (SELECT 'this is a test:12/01/2015 01/05/2018' 
    || chr(13) 
    ||chr(10) 
    || ' this is the 2nd line: 07/07/2017' Description 
    FROM dual 
) 
SELECT to_date(regexp_substr(A.Description , '\d{1,2}/\d{1,2}/\d{4}',1,level),'MM/DD/YYYY') 
FROM A 
    CONNECT BY level <= regexp_count(a.description, '\d{1,2}/\d{1,2}/\d{4}'); 
/

と別:

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; 

第一の場合には、我々は '< =' とでを使用する理由誰かが、私を説明することができます私たちは二番目ですか?

+0

最初の例では、 'IS NOT NULL' ==>単に' CONNECT BY regexp_substr(a.description、 '\ d {1,2}/\ d {1,2}/\ d {4 } '、1、level)はnullではありません。 2番目の例では、 'IS NOT NULL'の代わりに' CONNECT BY <= REGEXP_count('23,34,45,56 '、' [\、] + ')+ 1'を使用できます。'regexp_count'の代わりに' not not null'を選んだ人がいる理由は言うまでもありませんが、それは単に個人的な好みに過ぎません。 – krokodilko

+0

区切られたリストを解析するためにその2番目の選択で正規表現を使用しないでください。 NULLリスト要素を処理せず、誤った値を静かに返します。詳細はこちらをご覧ください:http://stackoverflow.com/questions/31464275/split-comma-separated-values-to-columns-in-oracle/31464699#31464699 –

答えて

0
Introduced in Oracle 10g 

REGEXP_SUBSTR - 正規表現に一致する文字列を返します。

Introduced in Oracle 11g 

REGEXP_COUNT - 文字列内の正規表現の出現回数を返します。

これは、関係演算子 '< ='を使用せずに達成することができます。 上記のコードでは、発生をカウントしています。あなたが必要ごとに「< =」を使用することができ、あなたの2番目の問合せで

WITH A AS 
     (SELECT 'this is a test:12/01/2015 01/05/2018' 
     || chr(13) 
     ||chr(10) 
     || ' this is the 2nd line: 07/07/2017' Description 
     FROM dual 
    ) 
    SELECT to_date(regexp_substr(A.Description , '\d{1,2}/\d{1,2}/\d{4}',1,level),'MM/DD/YYYY') 
    FROM A 
     CONNECT BY 
     regexp_substr(A.Description , '\d{1,2}/\d{1,2}/\d{4}',1,LEVEL) is not null; 

SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token",LEVEL 
     FROM DUAL 
    CONNECT BY LEVEL <= regexp_count(('23,34,45,56'),'[^,]+'); 
0

時々REGEXP_SUBSTRの出力にIS NOT NULLを使用して見つかった行の数がREGEXP_COUNTからの行数と同じであり、その後、彼らは同じことを行うと、それは個人の好みの問題です:

SELECT REGEXP_SUBSTR('1,2,3', '\d+', 1, LEVEL) AS value 
FROM DUAL 
CONNECT BY LEVEL <= REGEXP_COUNT('1,2,3', '\d+') 

SELECT REGEXP_SUBSTR('1,2,3', '\d+', 1, LEVEL) AS value 
FROM DUAL 
CONNECT BY REGEXP_SUBSTR('1,2,3', '\d+', 1, LEVEL) IS NOT NULL 

両方出力:

VALUE 
----- 
1 
2 
3 

しかし、時々マッチサブストリングは、(NULLに相当する)ゼロ幅とすることができ、それらはない:

SELECT REGEXP_SUBSTR('1,2,,4', '(\d*)(,|$)', 1, LEVEL, 1) AS value 
FROM DUAL 
CONNECT BY LEVEL <= REGEXP_COUNT('1,2,3', '(\d*)(,|$)') 

出力:

VALUE 
------ 
1 
2 
(null) 
4 
(null) 

と:

SELECT REGEXP_SUBSTR('1,2,,4', '(\d*)(,|$)', 1, LEVEL, NULL, 1) AS value 
FROM DUAL 
CONNECT BY REGEXP_SUBSTR('1,2,,4', '(\d*)(,|$)', 1, LEVEL, NULL, 1) IS NOT NULL 

出力:

VALUE 
------ 
1 
2 

最初にNULLの値で停止します。

あなたがいずれかのように、この例では、我々はむしろちょうどキャプチャグループより完全一致を抽出して、それを修正することができCONNECT BY節(中REGEXP_COUNTREGEXP_SUBSTR()関数の戻り値を持つNULL値を使用する必要があるすべての結果を得るために、すなわちREGEXP_SUBSTR('1,2,,4', '(\d*)(,|$)', 1, LEVEL) IS NOT NULL)。