如何在oracle中获取特殊字符之间的数字

时间:2018-07-10 04:27:52

标签: sql oracle oracle11g

您能帮我获得低于oracle的输出

File_20170902_Name.txt
File200_Name_20170902_1.txt
File400_20170902_Name_1.txt
File1_name_20170902.txt

我期望输出

20170902
20170902
20170902
20170902

提前谢谢!

4 个答案:

答案 0 :(得分:0)

假设文件名中的所有8位数字均为日期,并以_开头,后跟_.txt,则可以使用

select REGEXP_SUBSTR(files,'_(\d{8})(_|.txt)',1,1,NULL,1) as dt FROM t;

Demo

  

但是一些时间数字字符会发生变化,例如6(YYMMDD)字符

这将匹配__.txt之间的6到8个字符的序列

REGEXP_SUBSTR(files,'_((\d{6,8}))(_|)',1,1,NULL,1)

Demo2

但是,这不是匹配日期的综合正则表达式。也就是说,如果它们是文件名的一部分,则可以匹配20189999180000之类的数字。如果只想检测日期,则可能需要将它们与此处指定的方法结合使用:Valid Date Checks in Oracle

答案 1 :(得分:0)

尝试此演示:http://sqlfiddle.com/#!4/c361c/4

select
 regexp_replace(str,'.*(\d{8}).*','\1') as x
from table1

|        X |
|----------|
| 20170902 |
| 20170902 |
| 20170902 |
| 20170902 |

答案 2 :(得分:0)

尝试一下

create table tst (x varchar2(30));
insert into tst values ('File_20170902_Name.txt');
insert into tst values ('File200_Name_20170902_1.txt');
insert into tst values ('File400_20170902_Name_1.txt');
insert into tst values ('File1_name_20170902.txt');

Select x,       
      case 
          when substr(x, REGEXP_INSTR(x, '[^a-z|A-Z|0-9]') + 1, 1) between chr(48) and chr(57) Then 
            substr(x, REGEXP_INSTR(x, '[^a-z|A-Z|0-9]') + 1, REGEXP_INSTR(x, '[^a-z|A-Z|0-9]', 1, 2) - REGEXP_INSTR(x, '[^a-z|A-Z|0-9]') - 1) 
          else substr(x, REGEXP_INSTR(x, '[^a-z|A-Z|0-9]', 1, 2) + 1, REGEXP_INSTR(x, '[^a-z|A-Z|0-9]', 1, 3) - REGEXP_INSTR(x, '[^a-z|A-Z|0-9]', 1, 2) - 1) 
      end as t      
From tst  

注意:如果数字以2个以上的特殊字符(例如File_name_test_20170902.txt)开头,则该查询将不支持

答案 3 :(得分:0)

以下两者的工作原理大致相同-使用正则表达式进行基本选择,然后使用对instanceof的第二次调用或使用“常规”字符串函数来摆脱定界符。与使用Typeclass Test { public static void main(String[] args) { Object o = new Object(); Object i = 5; // auto-boxing Object[] arr = new Object[] { 10, "Acar çalış ozan", 15.0, 12.5f }; if (arr[1] instanceof String) System.out.println("arr[1] is an instance of String"); if (i instanceof Integer) System.out.println("i is an instance of Integer"); if (o instanceof Integer) { System.out.println("o is an instance of Integer"); } else System.out.println("o is NOT an instance of Integer"); } } 相比,我更喜欢嵌套调用REGEXP_SUBSTR,但是您可以选择:

嵌套调用REGEXP_SUBSTR

TRANSLATE

使用REPLACE

REGEXP_SUBSTR

使用WITH cteFiles AS (SELECT 'File_20170902_Name.txt' AS FILENAME FROM DUAL UNION ALL SELECT 'File200_Name_20170902_1.txt' AS FILENAME FROM DUAL UNION ALL SELECT 'File400_20170902_Name_1.txt' AS FILENAME FROM DUAL UNION ALL SELECT 'File1_name_20170902.txt' AS FILENAME FROM DUAL) SELECT FILENAME, REGEXP_SUBSTR(REGEXP_SUBSTR(FILENAME, '_[0-9]+[_.]'), '[^_.]+') AS FINAL_NUMS FROM cteFiles;

REPLACE

SQLFiddle here

好运。