我的表格中有列' ID',' File_Name'
表
ID File_Name
123 ROSE1234_LLDAtIInstance_03012014_04292014_190038.zip
456 ROSE1234_LLDAtIInstance_08012014_04292014_190038.zip
我只需要提取文件名中给出的第一个日期。
必需:
ID Date
123 03012014
456 08012014
答案 0 :(得分:0)
这是一种方法,假设第二个_之后的8个字符始终为真。
找到第一个_的位置然后使用第一个_ + 1的位置查找第二个_的位置然后它在第二个_
之后查找8个字符SELECT Id
, substr(File_name, instr(File_name,'_',instr(File_name,'_')+1)+1,8) as Date
FROM Table
或 更优雅的方法是使用RegExp_Instr函数,它不需要嵌套instr。
SELECT Id, substr(File_name,REGEXP_INSTR(FileName,'_',1,2)+1,8) as date
FROM dual;
答案 1 :(得分:0)
使用对REGEXP_SUBSTR()的简化调用:
SQL> with tbl(ID, File_name) as (
2 select 123, 'ROSE1234_LLDAtIInstance_03012014_04292014_190038.zip' from dual
3 union
4 select 456, 'ROSE1234_LLDAtIInstance_08012014_04292014_190038.zip' from dual
5 )
6 select ID,
7 REGEXP_SUBSTR(File_name, '_(\d{8})_', 1, 1, NULL, 1) "Date"
8 from tbl;
ID Date
---------- ----------------------------------------------------
123 03012014
456 08012014
SQL>
对于11g,click here for the parameters to REGEXP_SUBSTR( )。
编辑:将其设为虚拟列将是另一种处理它的方法。感谢Epicurist的帖子。一旦提交了ID和文件名,虚拟列将包含一个保存文件名日期的日期值。像这样添加:
alter table X_TEST add (filedate date generated always as (TO_DATE(REGEXP_SUBSTR(Filename, '_(\d{8})_', 1, 1, NULL, 1), 'MMDDYYYY')) virtual);
所以现在只需插入ID和文件名,提交就可以了。请注意它是只读的。
答案 2 :(得分:0)
为什么不简单地将日期放在单独的列中?例如。你可以查询(索引)日期。理论上说日期是文件的属性。它是关于避免错误,可维护性等。 zip文件中有什么?我想的Excel表格:-)