子串/从Oracle中的字符串值中提取期望

时间:2018-12-17 16:19:11

标签: sql oracle

嗨,我有下面的文字,并从下面的文字中获取文件名。但还需要提取日期。但我希望将其作为子字符串函数,而不是硬编码,以便可以从文本本身中提取日期。

select 
SUBSTR(fname, INSTR(fname, '_', -1)+1) as fname,  
'20181217' as fdate 
from
(
   select '/home/dir/file_name_20181217_product.csv' as fname from dual
);

4 个答案:

答案 0 :(得分:2)

假设该日期始终出现在第一个下划线(“ fname”开始的位置)之前,且该数字为8位数字,则可以执行以下操作:

select 
SUBSTR(fname, INSTR(fname, '_', -1)+1) as fname,  
SUBSTR(fname, INSTR(fname, '_', -1)-8,8) as fdate
from
(
   select '/home/dir/file_name_20181217_product.csv' as fname from dual
);

FNAME       fdate    
----------- --------
product.csv 20181217

答案 1 :(得分:1)

您始终可以使用regexp_substr()

   replace(regexp_substr(fname, '_[0-9]{8}_', 1, 1), '_', '') as date

对于文件名:

   regexp_substr(fname, '[^_]+$', 1, 1) as fname,

答案 2 :(得分:0)

如果您想“按原样”获取日期,那么这可能会有所帮助:

SQL> select
  2    SUBSTR(fname, INSTR(fname, '_', -1)+1) as fname,
  3    regexp_substr(fname, '\d+') as fdate                  --> this
  4  from (select '/home/dir/file_name_20181217_product.csv' as fname from dual);

FNAME       FDATE
----------- --------
product.csv 20181217

SQL>

答案 3 :(得分:0)

这将起作用:

select 
SUBSTR(fname, INSTR(fname, '/',1,3)+1),
instr(fname,'_')-INSTR(fname, '/',1,3)+1)) as fname,  
to_date(substr(fname,instr(fname,'_',1)+1,8),YYYYMMDD) as fdate 
from
(
   select '/home/dir/file_name_20181217_product.csv' as fname from dual
);