【问题标题】:How to extract a text between brackets in oracle sql query如何在oracle sql查询中提取括号之间的文本
【发布时间】:2021-08-31 16:04:43
【问题描述】:

我正在尝试从字符串中提取括号之间的值。

例如,我有这个字符串:

No information was found [AI1234]. 

我想得到括号之间的结果,即AI1234

但是表达式并不总是相同的。它可能会有所不同。

我正在尝试编写这样的查询:

REGEXP_SUBSTR(mssg, '\((.+)\)', 1, 1, NULL, 1) AS "description" from book

但它没有返回任何东西。我错过了什么?

我也已经尝试过类似的方法,问题是括号长度可能会有所不同。所以下面这个会返回一些东西,但不是我要找的东西:

substr(mssg,instr(mssg,'(')-8,10) as "description"

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    如果您要查找方括号之间的一组数字,请尝试以下操作:

    WITH
    indata(msg) AS (
      SELECT 'No information was found [1234]'
    )
    SELECT
      REGEXP_SUBSTR(
         msg                    -- the string
       , '^[^[]+[[](\d+)[]].*$' -- the pattern (with a captured
                                -- string "\d+" in round parentheses)
       , 1                      -- start from position 1
       , 1                      -- first found occurrence
       , ''                     -- no modifiers
       , 1                      -- first captured group
       ) AS extr
    FROM indata;
     extr 
    ------
     1234
    

    【讨论】:

      【解决方案2】:

      您应该在谷歌上搜索更多关于 oracle regexp 的信息。

      请试试这个。(Oracle 11g 以上)

      SELECT REGEXP_SUBSTR(mssg, '\[[^0-9]*(\d+)[^0-9]*\]', 1, 1, NULL, 1) description
      FROM book;
      

      **This在这里帮我回答了。

      更新:没关系。

      SELECT REGEXP_SUBSTR('No information was found [{AI1234}].', '[[({][^0-9]*(\d+)[^0-9]*[]})]', 1, 1, NULL, 1) description
      FROM dual;
      


      更新:最终解决方案

      SELECT REGEXP_SUBSTR('No information was found [{AI1234}].', '[[({]+([^][)(}{]*)[])}]+', 1, 1, NULL, 1) description
      FROM dual;
      

      在这里,您应该注意[^][)(}{]
      不要交换括号字符。 我会引用Oracle 11g Regexp reference

      [ ]

      用于指定匹配列表的括号表达式,该列表应匹配列表中表示的任何一个表达式。不匹配的列表表达式以抑扬符 (^) 开头,并指定与列表中表示的表达式以外的任何字符匹配的列表。

      要在方括号表达式中指定右方括号 (]),请将其放在列表的第一个位置(如果有的话,在初始的抑扬符 (^) 之后)。

      要在括号表达式中指定连字符,请将其放在列表的第一个位置(在初始的抑扬符 (^) 之后,如果有的话)、最后一个或作为范围表达式中的结束范围点。

      这部分 - [^ ] - 很难破解,最后我从参考资料中找到了解决方案,这就是我强调这一点的原因。

      【讨论】:

      • 这成功了!非常感谢您的帮助!
      • 如果我在这些括号内也有字母怎么办?它不返回括号内有字母和数字的那些。另外,如果我需要消息中的第三个括号怎么办?谢谢
      • @user16523359 我测试并更新了,这也许是你想要的。
      • 更新后的代码只返回数字 1234,而不是字母 AI。
      • @user16523359 啊,你的意思是括号中的所有字母,而不仅仅是数字?是的,我会纠正它:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多