我有VP3 - Art&设计和HS5 - 健康&社交关怀,我需要在Oracle中的' - '之后得到字符串。可以使用substring实现吗?
谢谢, 的Ar
答案 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
。