【问题标题】:How to get string after character oracle如何在字符oracle之后获取字符串
【发布时间】:2017-12-23 06:01:42
【问题描述】:

我有VP3 - Art & Design and HS5 - Health & Social Care,我需要在Oracle 中'-' 之后获取字符串。这可以使用子字符串来实现吗?

【问题讨论】:

    标签: sql oracle substring


    【解决方案1】:

    你可以使用:

    SELECT CASE
           WHEN INSTR(value, '-') > 0
           THEN SUBSTR(value, INSTR(value, '-') + 1)
           END AS subject
    FROM   table_name
    

    SELECT REGEXP_SUBSTR( value, '-(.*)$', 1, 1, NULL, 1 ) AS subject
    FROM   table_name
    

    其中,对于样本数据:

    CREATE TABLE table_name ( value ) AS
    SELECT 'VP3 - Art & Design and HS5 - Health & Social Care' FROM DUAL UNION ALL
    SELECT '1-2-3' FROM DUAL UNION ALL
    SELECT '123456' FROM DUAL
    

    两个输出:

    |主题 | | :-------------------------------------------- | |艺术与设计和 HS5 - 健康与社会关怀 | | 2-3 | | |

    修剪前导空白:

    如果你想修剪前导空白,那么你可以使用:

    SELECT CASE
           WHEN INSTR(value, '-') > 0
           THEN LTRIM(SUBSTR(value, INSTR(value, '-') + 1))
           END AS subject
    FROM   table_name
    

    SELECT REGEXP_SUBSTR( value, '-\s*(.*)$', 1, 1, NULL, 1 ) AS subject
    FROM   table_name
    

    这两个输出:

    |主题 | | :-------------------------------------------- | |艺术与设计和 HS5 - 健康与社会关怀 | | 2-3 | | |

    为什么幼稚的解决方案并不总是有效:

    SELECT SUBSTR(value, INSTR(value, '-') + 2) AS subject
    FROM   table_name
    

    在2种情况下不起作用:

    • 它找到- 字符的索引,然后跳过2 个字符(- 字符,然后是假定的空白字符);如果第二个字符不是空白字符,那么它将错过子字符串的第一个字符(即,如果输入是 1-2-3,那么输出将是 -3 而不是 2-3)。
    • 它假定字符串中总会有一个- 字符;如果不是这种情况,那么它将错误地返回从第二个字符开始的子字符串,而不是返回NULL(即,如果输入是123456,那么输出是23456 而不是NULL)。

    使用正则表达式:

    SELECT REGEXP_SUBSTR(value, '[^-]+', 1, 2)
    FROM   table_name
    

    在第一个- 字符之后没有找到子字符串;它将找到第一个和第二个- 字符之间的子字符串,并删除该范围之外的任何字符(包括- 字符)。因此,如果输入是VP3 - Art & Design and HS5 - Health & Social Care,那么输出是Art & Design and HS5,而不是预期的 Art & Design and HS5 - Health & Social Care

    【讨论】:

      【解决方案2】:

      你可以使用regexp_substr():

      select regexp_substr(col, '[^-]+', 1, 2)
      

      如果你想删除一个可选空格,那么你可以使用trim():

      select trim(leading ' ', regexp_substr(col, '[^-]+', 1, 2))
      

      非卵形参数的意思

      • 1 -- 从源的第一个字符开始搜索。 1 是默认值,但无论如何您都必须设置它才能提供第二个参数。
      • 2 -- 将第二个匹配作为结果子字符串。默认值为 1。

      【讨论】:

      • 如果 col 是一个复杂的表达式,这是一个很好的解决方案,所以你不必提到两次。
      • 我在尝试trim(leading ' ', regexp_substr(col, '[^-]+', 1, 2)) 时遇到语法错误。我改用这个:trim(regexp_substr(col, '[^-]+', 1, 2)).
      【解决方案3】:

      对于像这样简单的字符串操作,我可能只使用基本的INSTR()SUBSTR() 函数。在下面的查询中,我们从连字符 之后的两个位置开始获取列的子字符串。

      SELECT
          SUBSTR(col, INSTR(col, '-') + 2) AS subject
      FROM yourTable
      

      我们也可以在此处使用REGEXP_SUBSTR()(请参阅 Gordon 的回答),但它会更复杂一些,性能可能不如上述查询。

      【讨论】:

      • 非常感谢蒂姆
      猜你喜欢
      • 2020-02-06
      • 2012-09-16
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多