Sql 需要从文件名中提取字符串

Sql 需要从文件名中提取字符串,sql,oracle,Sql,Oracle,我在暂存表中有一列,在其中插入文件名。文件名的格式如下所示: T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in (我需要从上面的字符串中提取12345,该字符串可以是任意长度的任意字符串) 我需要从上面的文件名中提取,请告诉我们如何在Oracle SQL中执行此操作 谢谢我肯定有一个regexp可以做到这一点,但这不是我的强项。但是,instr和substr的组合将使您达到

我在暂存表中有一列,在其中插入文件名。文件名的格式如下所示:

T225674_<suppliercode><YYYYMMDD>-<HHMM>_**<TIMBE NUMBER>**.in
(我需要从上面的字符串中提取12345,该字符串可以是任意长度的任意字符串)

我需要从上面的文件名中提取
,请告诉我们如何在Oracle SQL中执行此操作


谢谢

我肯定有一个regexp可以做到这一点,但这不是我的强项。但是,instr和substr的组合将使您达到以下目标:

substr(string, instr(string, '_', -1) + 1, instr(string, '.') - instr(string, '_', -1) - 1))

我肯定有一个regexp可以做到这一点,但这不是我的强项。但是,instr和substr的组合将使您达到以下目标:

substr(string, instr(string, '_', -1) + 1, instr(string, '.') - instr(string, '_', -1) - 1))

带有
regexp\u replace
的解决方案:

SELECT regexp_replace(a,'(T225674_.*_)(.*)(\.in)' ,'\2') from (
  select 'T225674_789020161010-0900_12345.in' a from dual
)
第一部分
(T225674.*.\u)
匹配以
T225674\u
开头,以
结尾的任何内容。然后为接下来的内容留出空间,直到结束组
(.in)
:这是第二组
(.*)
的目的


使用
regexp\u replace
,您可以播放匹配组的内容。在这里,我仅使用
\2
带有
regexp\u replace
的解决方案打印第2组的内容:

SELECT regexp_replace(a,'(T225674_.*_)(.*)(\.in)' ,'\2') from (
  select 'T225674_789020161010-0900_12345.in' a from dual
)
第一部分
(T225674.*.\u)
匹配以
T225674\u
开头,以
结尾的任何内容。然后为接下来的内容留出空间,直到结束组
(.in)
:这是第二组
(.*)
的目的


使用
regexp\u replace
,您可以播放匹配组的内容。在这里,我只打印第2组的内容,带有
\2

@Rene完美地回答了这个问题,但为了完整性,这里有一个正则表达式substr解决方案

这是一个经过修改的版本

(.*2}
-第二个下划线后面的任何内容


(.*?)\.
-小数点之前的任何内容都能完美地回答这个问题,但为了完整起见,这里有一个正则表达式substr解决方案

这是一个经过修改的版本

(.*2}
-第二个下划线后面的任何内容


(.*?)\.
-小数点之前的任何内容

为了更完整(对user3240704眨眼),这里有一个更简单、更高效的regexp解决方案。即使这样,也比Rene的解决方案慢

使用OP提供的信息:要搜索的数字前面是下划线,后面是准确的字符串
。“
”(如果该信息不正确,则解决方案将失败)

这将搜索下划线,后跟一个或多个数字(\d表示数字,+表示一个或多个),后跟句点(转义:。因为在正则表达式中,它本身表示“任何字符”),后跟“in”,后跟字符串结尾-因此搜索模式定位在输入字符串的结尾


\d+
放在括号中,使其成为一个“子表达式”,可以在
regexp\u substr()
函数中引用。第六个参数1表示“从匹配的子字符串返回作为第一个子表达式的子字符串”。

以获得更完整性(对user3240704眨眼),这是一个更简单、更高效的regexp解决方案。即使这样,它也会比Rene的解决方案慢

使用OP提供的信息:要搜索的数字前面是下划线,后面是准确的字符串
。“
”(如果该信息不正确,则解决方案将失败)

这将搜索下划线,后跟一个或多个数字(\d表示数字,+表示一个或多个),后跟句点(转义:。因为在正则表达式中,它本身表示“任何字符”),后跟“in”,后跟字符串结尾-因此搜索模式定位在输入字符串的结尾


\d+
放在括号中,使其成为一个“子表达式”,可以在
regexp\u substr()
函数中引用。第六个参数1表示“返回匹配子字符串中第一个子表达式的子字符串。”

谢谢您的解释。谢谢您的解释。这个问题怎么太宽了?为什么不尝试这样的子字符串?这个问题怎么太宽了?为什么不尝试这样的子字符串?即使是最好的regexp解决方案(尚未提出)将比使用
instr
substr
慢。只有当使用
instr
substr
的简单解决方案不可用时,才应使用regexp解决方案。不过,这里有一点挑剔:我还将使用
-1
第三个参数来搜索周期(以防万一字符串中可能有其他句点,例如在供应商代码中)。即使是最好的regexp解决方案(尚未提出)将比使用
instr
substr
慢。只有当使用
instr
substr
的简单解决方案不可用时,才应使用regexp解决方案。不过这里有一点挑剔:我还将使用
-1
第三个参数来搜索周期(以防万一字符串中可能有其他句点,例如在供应商代码中)。这段代码非常好。答案现在肯定是“完成”;)这段代码非常好。答案现在肯定是“完成”;)
select regexp_substr(input_string, '_(\d+)\.in$', 1, 1, null, 1) from....