您能帮我获得低于oracle的输出
File_20170902_Name.txt
File200_Name_20170902_1.txt
File400_20170902_Name_1.txt
File1_name_20170902.txt
我期望输出
20170902
20170902
20170902
20170902
提前谢谢!
答案 0 :(得分:0)
假设文件名中的所有8位数字均为日期,并以_
开头,后跟_
或.txt
,则可以使用
select REGEXP_SUBSTR(files,'_(\d{8})(_|.txt)',1,1,NULL,1) as dt FROM t;
但是一些时间数字字符会发生变化,例如6(YYMMDD)字符
这将匹配_
或_
与.txt
之间的6到8个字符的序列
REGEXP_SUBSTR(files,'_((\d{6,8}))(_|)',1,1,NULL,1)
但是,这不是匹配日期的综合正则表达式。也就是说,如果它们是文件名的一部分,则可以匹配20189999
或180000
之类的数字。如果只想检测日期,则可能需要将它们与此处指定的方法结合使用: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
的第二次调用或使用“常规”字符串函数来摆脱定界符。与使用Type
或class 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
好运。