Sql oracle中的字符串值应为子字符串/提取

Sql oracle中的字符串值应为子字符串/提取,sql,oracle,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 ); 如果您希望按“原样”获取日期,那么这可能会有帮助: SQ

嗨,我有下面的文本和从下面的文本文件名。但也需要日期摘录。但我不想硬编码,而是想作为子字符串函数,从文本本身提取日期

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
);
如果您希望按“原样”获取日期,那么这可能会有帮助:

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>
如果您希望按“原样”获取日期,那么这可能会有帮助:

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>

假设该日期始终出现在第一个下划线(即“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

假设该日期始终出现在第一个下划线(即“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
这将有助于:

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
);
这将有助于:

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
);

您可以始终使用
regexp\u substr()

对于文件名:

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

您可以始终使用
regexp\u substr()

对于文件名:

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

你需要定义一个你可以使用的模式——看起来你有一个8位的“日期”,比如从最后一个斜杠到文件名。然后看看
regexp\u substr
函数,也许吧?如果文件名在这些位置有固定数量的下划线,你只能坚持使用普通的
substr
,真的;当然,你的真实姓名也可能是这样……很抱歉搞混了,我已经编辑了日期输出。我需要完全相同的日期从substring instring commands中得到的内容您使用的是不同于其标准定义的技术术语。在像计算机技术这样的领域,这可能会产生问题。在您的示例中,整个子字符串
文件名\u 20181217\u product.csv
就是文件名。您当前的代码只提取
product.csv
——这不是文件名,至少不是根据标准技术定义。你最好为你需要的东西创建一个新的术语,以免给你自己和现在或将来可能从事同一任务的其他人造成混淆。你需要定义一个你可以使用的模式——看起来你有一个8位数的“日期”,从最后一个斜杠到文件名。然后看看
regexp\u substr
函数,也许吧?如果文件名在这些位置有固定数量的下划线,你只能坚持使用普通的
substr
,真的;当然,你的真实姓名也可能是这样……很抱歉搞混了,我已经编辑了日期输出。我需要完全相同的日期从substring instring commands中得到的内容您使用的是不同于其标准定义的技术术语。在像计算机技术这样的领域,这可能会产生问题。在您的示例中,整个子字符串
文件名\u 20181217\u product.csv
就是文件名。您当前的代码只提取
product.csv
——这不是文件名,至少不是根据标准技术定义。您最好为您需要的内容创建一个新术语,以免给您自己和现在或将来可能从事相同任务的其他人造成混淆。product.csv不是文件名。。。。。我已经为文件名设置了substr。。。它工作正常。。我只需要提取日期。。。。我认为不需要仪器。这是固定的文件名,因此可以通过以下方式提取到日期(SUBSTR(fname,11,8),'DDMMYYYY'),因为fdateproduct.csv不是文件名。。。。。我已经为文件名设置了substr。。。它工作正常。。我只需要提取日期。。。。我认为不需要仪器。这是一个固定的文件名,因此可以将其提取为fdate