Sql 用于查找字符串的Regexp或substr或其他方法

Sql 用于查找字符串的Regexp或substr或其他方法,sql,regex,string,oracle,substr,Sql,Regex,String,Oracle,Substr,我希望达到最佳性能,并仅在单词DL之后选择一个字符串: 我有一列varchar2,其中包含以下值: DL:1011909825 Obj:020190004387 DL:8010406429 Obj:020190004388 DL:8010406428 DL:190682 DL:PDL01900940 Obj:020190004322 DL:611913067 因此,输出应该是这样的: 1011909825 8010406429

我希望达到最佳性能,并仅在单词DL之后选择一个字符串:

我有一列varchar2,其中包含以下值:

    DL:1011909825
    Obj:020190004387 DL:8010406429
    Obj:020190004388 DL:8010406428
    DL:190682
    DL:PDL01900940
    Obj:020190004322 DL:611913067
因此,输出应该是这样的:

    1011909825
    8010406429
    8010406428
    190682
    PDL01900940
    611913067
我不擅长正则表达式,但我尝试了regexp\u replace:

regexp_replace(column,'Obj:|DL:','',1, 0, 'i')
几乎可以,但输出仍然不一样:

    1011909825
    020190004387 8010406429
    020190004388 8010406428
    190682
    PDL01900940
    020190004322 611913067

如何解决此问题并达到最佳性能?

如果数据总是这样,则SUBSTR+INSTR执行以下操作:

SQL> with test (col) as
  2    (
  3      select 'DL:1011909825' from dual union all
  4      select 'Obj:020190004387 DL:8010406429' from dual union all
  5      select 'Obj:020190004388 DL:8010406428' from dual union all
  6      select 'DL:190682' from dual union all
  7      select 'DL:PDL01900940' from dual union all
  8      select 'Obj:020190004322 DL:611913067' from dual
  9     )
 10  select col, substr(col, instr(col, 'DL:') + 3) result
 11  from test;

COL                            RESULT
------------------------------ ------------------------------
DL:1011909825                  1011909825
Obj:020190004387 DL:8010406429 8010406429
Obj:020190004388 DL:8010406428 8010406428
DL:190682                      190682
DL:PDL01900940                 PDL01900940
Obj:020190004322 DL:611913067  611913067

6 rows selected.

SQL>
REGEXP\u SUBSTR可能如下所示:

 <snip>
 10  select col,
 11         ltrim(regexp_substr(col, 'DL:\w+'), 'DL:') resul
 12  from test;

COL                            RESULT
------------------------------ -----------------------------
DL:1011909825                  1011909825
Obj:020190004387 DL:8010406429 8010406429
Obj:020190004388 DL:8010406428 8010406428
DL:190682                      190682
DL:PDL01900940                 PDL01900940
Obj:020190004322 DL:611913067  611913067

如果有很多数据,这应该比正则表达式快得多。

如果数据总是这样,那么SUBSTR+INSTR执行以下操作:

SQL> with test (col) as
  2    (
  3      select 'DL:1011909825' from dual union all
  4      select 'Obj:020190004387 DL:8010406429' from dual union all
  5      select 'Obj:020190004388 DL:8010406428' from dual union all
  6      select 'DL:190682' from dual union all
  7      select 'DL:PDL01900940' from dual union all
  8      select 'Obj:020190004322 DL:611913067' from dual
  9     )
 10  select col, substr(col, instr(col, 'DL:') + 3) result
 11  from test;

COL                            RESULT
------------------------------ ------------------------------
DL:1011909825                  1011909825
Obj:020190004387 DL:8010406429 8010406429
Obj:020190004388 DL:8010406428 8010406428
DL:190682                      190682
DL:PDL01900940                 PDL01900940
Obj:020190004322 DL:611913067  611913067

6 rows selected.

SQL>
REGEXP\u SUBSTR可能如下所示:

 <snip>
 10  select col,
 11         ltrim(regexp_substr(col, 'DL:\w+'), 'DL:') resul
 12  from test;

COL                            RESULT
------------------------------ -----------------------------
DL:1011909825                  1011909825
Obj:020190004387 DL:8010406429 8010406429
Obj:020190004388 DL:8010406428 8010406428
DL:190682                      190682
DL:PDL01900940                 PDL01900940
Obj:020190004322 DL:611913067  611913067

如果有大量数据,这应该比正则表达式快得多。

substr+instr将具有更好的性能,但如果要使用regexp:

-- substr + instr will have better performance
with s (str) as (
select 'DL:1011909825' from dual union all
select 'Obj:020190004387 DL:8010406429' from dual union all
select 'Obj:020190004388 DL:8010406428' from dual union all
select 'DL:190682' from dual union all
select 'DL:PDL01900940' from dual union all
select 'Obj:020190004322 DL:611913067' from dual)
select str, regexp_substr(str, 'DL:(.*)', 1, 1, null, 1) rs
from s;

STR                            RS                            
------------------------------ ------------------------------
DL:1011909825                  1011909825                    
Obj:020190004387 DL:8010406429 8010406429                    
Obj:020190004388 DL:8010406428 8010406428                    
DL:190682                      190682                        
DL:PDL01900940                 PDL01900940                   
Obj:020190004322 DL:611913067  611913067                     

6 rows selected.

substr+instr将具有更好的性能,但如果要使用regexp:

-- substr + instr will have better performance
with s (str) as (
select 'DL:1011909825' from dual union all
select 'Obj:020190004387 DL:8010406429' from dual union all
select 'Obj:020190004388 DL:8010406428' from dual union all
select 'DL:190682' from dual union all
select 'DL:PDL01900940' from dual union all
select 'Obj:020190004322 DL:611913067' from dual)
select str, regexp_substr(str, 'DL:(.*)', 1, 1, null, 1) rs
from s;

STR                            RS                            
------------------------------ ------------------------------
DL:1011909825                  1011909825                    
Obj:020190004387 DL:8010406429 8010406429                    
Obj:020190004388 DL:8010406428 8010406428                    
DL:190682                      190682                        
DL:PDL01900940                 PDL01900940                   
Obj:020190004322 DL:611913067  611913067                     

6 rows selected.

你可以从中得到一些想法

DL:(.*)

Match 1
1.  1011909825
Match 2
1.  8010406429
Match 3
1.  8010406428
Match 4
1.  190682
Match 5
1.  PDL01900940
Match 6
1.  611913067

你可以从中得到一些想法

DL:(.*)

Match 1
1.  1011909825
Match 2
1.  8010406429
Match 3
1.  8010406428
Match 4
1.  190682
Match 5
1.  PDL01900940
Match 6
1.  611913067
或者使用:

或者使用:

Obj:是否可以遵循DL:?您是否有类似DL:1011909825 Obj:02019004387的值?最好的方法取决于数据的混乱程度以及是否需要预先验证输出?您是否有类似DL:1011909825 Obj:02019004387的值?最好的方法取决于数据的混乱程度以及是否需要预先验证输出。此DL:*显示了使用regexps的好处,与Littlefoot的非regex解决方案完全相同。此DL:*显示了使用regexps的好处,与Littlefoot的非regex解决方案完全相同