如何在字符oracle之后获取字符串

时间:2017-07-18 11:31:12

标签: oracle substring

我有VP3 - Art&设计和HS5 - 健康&社交关怀,我需要在Oracle中的' - '之后得到字符串。可以使用substring实现吗?

谢谢, 的Ar

3 个答案:

答案 0 :(得分:8)

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

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

我们也可以在这里使用REGEXP_SUBSTR()(请参阅Gordon的回答),但它会有点复杂,性能可能不如上述查询那么好。

答案 1 :(得分:5)

您可以使用regexp_substr()

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

如果要删除可选空格,可以使用trim()

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

答案 2 :(得分:0)

您可以使用:

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

两个输出:

<块引用>
| SUBJECT                                      |
| :------------------------------------------- |
|  Art & Design and HS5 - Health & Social Care |
| 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

两个输出:

<块引用>
| SUBJECT                                     |
| :------------------------------------------ |
| Art & Design and HS5 - Health & Social Care |
| 2-3                                         |
| null                                        |

为什么简单的解决方案并不总是有效:

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

在两种情况下不起作用:

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

使用正则表达式:

NULL

没有找到第一个 SELECT REGEXP_SUBSTR(value, '[^-]+', 1, 2) FROM table_name 字符后的子串;它将找到第 1 个和第 2 个 - 字符之间的子字符串,并去除该范围之外的任何字符(包括 - 字符)。因此,如果输入是 -,那么输出是 VP3 - Art & Design and HS5 - Health & Social Care 而不是预期的 Art & Design and HS5