【问题标题】:How can I extract a word from a string using Oracle regexp_substr?如何使用 Oracle regexp_substr 从字符串中提取单词?
【发布时间】:2021-08-04 13:09:35
【问题描述】:

我正在尝试使用 Oracle 12c regexp_substr 从字符串中提取一个单词,但无法理解它是如何工作的,网络上的信息太多,我很困惑。

所以我想从字符串中提取tmp* 表:

query_str:

 select 
 column1 c1,
 column2 c2
 from tmp_123 foo1, -- some comments here
 TAB1_123 TAB1
 where 1=1
;

尝试使用这个但没有“运气”:

select regexp_substr(query_str, 'TMP_[A-z]+', 1, 1, 'i');

我想提取直到空格和tmp表名中间可以有数字这样:tmp_123。

有什么建议吗?

【问题讨论】:

  • 可能是'TMP_\w+' 或'TMP_\S+'?
  • 我觉得效果很好,谢谢
  • W(单词)和S(空格)有什么区别?

标签: regex oracle substr


【解决方案1】:

您可以使用这两种方法中的任何一种:

select regexp_substr(query_str, 'TMP_\w+', 1, 1, 'i');
select regexp_substr(query_str, 'TMP_\S+', 1, 1, 'i');

\w+ 将匹配TMP_ 之后的字母数字或下划线字符,\S+ 将匹配一个或多个非空白字符。

请参阅\w regex demo 和\S regex demo。

【讨论】:

  • 谢谢,因为我的声誉,我不能投票?!?!
  • @mendesn 现在你可以了。如果对您有用,也请考虑接受答案。
  • 前者可能比后者好,因为在from 子句中,表名通常紧跟逗号(如果表没有别名)。此外,这将匹配来自NEW_TMP_whatever 的TMP_whatever;值得询问 OP 是否必须处理。
【解决方案2】:

主要问题是显示的 SELECT 语句在需要 FROM 子句的 Oracle 中无效。下面是一个如何完成这项工作的示例:

WITH cteData
  AS (SELECT 'select' AS QUERY_STR FROM DUAL UNION ALL
      SELECT 'column1 c1,' AS QUERY_STR FROM DUAL UNION ALL
      SELECT 'column2 c2' AS QUERY_STR FROM DUAL UNION ALL
      SELECT 'from tmp_123 foo1, -- some comments here' AS QUERY_STR FROM DUAL UNION ALL
      SELECT 'TAB1_123 TAB1' AS QUERY_STR FROM DUAL UNION ALL
      SELECT 'where 1=1' AS QUERY_STR FROM DUAL UNION ALL
      SELECT ';' AS QUERY_STR FROM DUAL)
select regexp_substr(query_str, 'TMP_[A-z]+', 1, 1, 'i') AS MATCH
  FROM cteData
  WHERE regexp_substr(query_str, 'TMP_[A-z]+', 1, 1, 'i') IS NOT NULL

在这里,我将您的数据逐行放入名为“cteData”的公用表表达式 (CTE) 中,然后 SELECT 将其用作其数据源。这将返回该行

tmp_123 foo1, -- some comments here

db<>fiddle here

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2022-11-24
    • 2019-10-26
    • 2014-08-18
    • 2021-12-18
    • 1970-01-01
    • 2022-01-19
    • 2017-02-14
    • 2012-10-27
    相关资源
    最近更新 更多