我有 VP3 - 艺术与设计和HS5 - 健康与社会护理
,我需要在 Oracle 中获取 '-'
后面的字符串。这是否可以使用 substring 来实现?
对于这样简单的字符串操作,我可能会使用基本的INSTR()
和SUBSTR()
函数。在下面的查询中,我们截取从连字符之后两个位置开始的列的子串。
SELECT
SUBSTR(col, INSTR(col, '-') + 2) AS subject
FROM yourTable
我们也可以在这里使用 REGEXP_SUBSTR()
(请参见Gordon的答案),但它可能会更加复杂,并且性能可能不如上面的查询。
您可以使用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))
。 - User1974您可以使用:
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
。