2016-05-17 16 views
-1

Oracleデータベースにnotesの列があります& Notesの列のデータには、CharacterまたはCharacter with Datesという文字列を含めることができます。それ以外は空白です。Oracleの正規表現の日付

ノート
PO請求書番号1234
POの請求書番号34555
addnsd; 2016年1月1日、2016年1月4日; ssnfdskjnfkjsnfk
andksnd; 2016年1月2日、2016年2月1日。 sdnskjnfk
ホテル
Loding

おかげアディティ

+0

不適切なデザイン。あなたは再因子化することができますか?日付は常にMM/DD/YYY形式で、「;」で区切られます。 ? – OldProgrammer

+0

はい、MM/DD/YYYYになりますが、データは - :asasds; 01/01/2016; 01/02/2016; sdsdsfdfまたはdadad; adsdsd; 01/02/2016; 02/10/2016; sadsadsdsd – user6167232

+0

テーブルまたは複数の行から複数​​の行を表示する例ですか? – OldProgrammer

答えて

0

はD \ {2}/\ D {2}/\ D {4}これは、それらの日付形式と一致します

+0

あなたは詳細を教えてもらえますか? OPデータの例を表示できますか? – Aleksej

+0

これは、例のような特定のセット[0-9]の代わりに、数字 '\ d'にあらかじめ定義された値を使用する点を除いて、あなたのソリューションによく似ています。したがって、 '\ d {2}/\ d {2}/\ d {4}'は '[0-9] {2}/[0-9] {2}/[0-9] {4} 'これらの定義済みの値のリストは、次のURLから入手できます。http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#sthref553 – TwistedStem

0

あなたはこれを試すことができます。

with notes(text) as (
select 'PO Invoice number 1234' from dual union all 
select 'PO invoice number 34555' from dual union all 
select 'addnsd;01/01/2016;01/04/2016;ssnfdskjnfkjsnfk' from dual union all 
select 'andksnd;01/02/2016;02/01/2016;sdnskjnfk' from dual union all 
select 'Hotel' from dual union all 
select 'Loding' from dual 
) 
select text, listagg(date_string, ';') within group (order by date_string) 
from (
     select distinct text, regexp_substr(text, '[0-9]{2}/[0-9]{2}/[0-9]{4}', 1, level) as date_string 
     from notes 
     connect by regexp_instr(text, '[0-9]{2}/[0-9]{2}/[0-9]{4}', 1, level) != 0 
    ) 
group by text 

これはDISTINCT使用していますので、あなたが複数回行に比べて同じ日付を持っている場合、あなただけの1件の発生を取得します。