【问题标题】:How do I extract part of the filename?如何提取文件名的一部分?
【发布时间】:2019-10-28 08:05:17
【问题描述】:

我有一个文件名 415-11-CV-21654-CBB-20190228-0-transactions.csv。 我想从上面的名称中获得 11-CV-21654-CBB。如何在 sql 查询中使用正则表达式来做到这一点

【问题讨论】:

标签: sql regex oracle


【解决方案1】:

一个选项是

with t(str) as
(
  select '415-11-CV-21654-CBB-20190228-0-transactions.csv' from dual
)
select substr(str,1,instr(str,to_char(sysdate,'-yyyy')) - 1  )
   as "Result String"
  from t;

Result String
-------------------
415-11-CV-21654-CBB

或另一个:

with t(str,year) as
(
  select '415-11-CV-21654-CBB-20190228-0-transactions.csv', to_char(sysdate,'yyyy') 
    from dual
)
select rtrim(regexp_substr(str,'(*.)+'||year),'-'||year)
   as "Result String"
  from t

Result String
-------------------
415-11-CV-21654-CBB

用连字符前缀提取到当前年份的部分。

【讨论】:

  • 如果我们知道文件名的名称中始终包含当前年份,这将起作用。在这一点上这个问题还不清楚,但我认为一个适用于任何一年的解决方案会更好。
  • @APC 我同意,但需要抓住一个明显的线索,这在逻辑上似乎是正确的。否则,我们怎么知道呈现的数字是一年?
  • @hetulvaraiya 不客气。顺便说一句,您能否解释一下您是否需要提取到当前年份或第 5 个连字符的逻辑,或者其他什么..?由于这个逻辑,请编辑您的问题。
【解决方案2】:

这是使用regexp_replace()的一种方法:

select regexp_replace(fname, '^[^-]+-([^-]+-[^-]+-[^-]+-[^-]+).*$', '\1')
from (select '415-11-CV-21654-CBB-20190228-0-transactions.csv' as fname from dual) x

【讨论】:

  • @hetulvaraiya - 如果您发现此答案有用,请考虑投票和/或接受它。接受的答案提高了 StackOverflow 作为其他 Seeker 资源的质量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多