如何在Oracle中获取特定字符后的字符串

18

我有 VP3 - 艺术与设计和HS5 - 健康与社会护理,我需要在 Oracle 中获取 '-' 后面的字符串。这是否可以使用 substring 来实现?

3个回答

27

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

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

我们也可以在这里使用 REGEXP_SUBSTR()(请参见Gordon的答案),但它可能会更加复杂,并且性能可能不如上面的查询。


非常感谢,Tim。 - Aruna Raghunam

15

您可以使用regexp_substr()函数:

select regexp_substr(col, '[^-]+', 1, 2)
如果你想去掉一个可选的空格,可以使用 trim() 方法:
select trim(leading ' ', regexp_substr(col, '[^-]+', 1, 2))

非显式参数意味着

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

1
如果col是一个复杂的表达式,那么这是一个很好的解决方案,因此您不必重复提及它。 - towi
当我尝试使用trim(leading ' ', regexp_substr(col, '[^-]+', 1, 2))时,出现了语法错误。我改用了这个:trim(regexp_substr(col, '[^-]+', 1, 2)) - User1974

2

您可以使用:

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                                          |
| null                                         |

删除前导空格:

如果您想要删除前导空格,可以使用以下代码:

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                                         |
| null                                        |

为什么朴素的解决方案并不总是奏效:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接