【发布时间】:2017-12-23 06:01:42
【问题描述】:
我有VP3 - Art & Design and HS5 - Health & Social Care,我需要在Oracle 中'-' 之后获取字符串。这可以使用子字符串来实现吗?
【问题讨论】:
我有VP3 - Art & Design and HS5 - Health & Social Care,我需要在Oracle 中'-' 之后获取字符串。这可以使用子字符串来实现吗?
【问题讨论】:
你可以使用:
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。
【讨论】:
你可以使用regexp_substr():
select regexp_substr(col, '[^-]+', 1, 2)
如果你想删除一个可选空格,那么你可以使用trim():
select trim(leading ' ', regexp_substr(col, '[^-]+', 1, 2))
非卵形参数的意思
1 -- 从源的第一个字符开始搜索。 1 是默认值,但无论如何您都必须设置它才能提供第二个参数。 2 -- 将第二个匹配作为结果子字符串。默认值为 1。【讨论】:
trim(leading ' ', regexp_substr(col, '[^-]+', 1, 2)) 时遇到语法错误。我改用这个:trim(regexp_substr(col, '[^-]+', 1, 2)).
对于像这样简单的字符串操作,我可能只使用基本的INSTR() 和SUBSTR() 函数。在下面的查询中,我们从连字符 之后的两个位置开始获取列的子字符串。
SELECT
SUBSTR(col, INSTR(col, '-') + 2) AS subject
FROM yourTable
我们也可以在此处使用REGEXP_SUBSTR()(请参阅 Gordon 的回答),但它会更复杂一些,性能可能不如上述查询。
【讨论】: