在SQL中提取特定字符串

时间:2014-07-02 22:51:38

标签: sql oracle

我需要使用Oracle中的SQL从不同的字符串中提取或保留某些字符。我使用了SUBSTR功能,但这并不适用于所有情况。

示例:值如下:

B2B_BID-XSKU957109
B2B_BID-SKU340535
B2B-SKU342345
B2B_BID-SKU340020201

我想要的结果:

SKU957109
SKU340535
SKU342345
SKU340020201

所以它不是最后10个字符,但我只想要字符串'SKU'和跟随它的数字的部分。我已经举了各种例子。感谢

2 个答案:

答案 0 :(得分:2)

您可以使用substr()instr()reverse()获得所需内容:

select substr(val, 1-instr(reverse(val), '-'))
from (select 'B2B_BID-XSKU957109' as val from dual) t

以上似乎回答了关于在最后-之后获取内容的稍微不同的问题。获取最后SKU的内容:

select substr(val, instr(val, 'SKU'))
from (select 'B2B_BID-XSKU957109' as val from dual) t

Here是一个小小的SQL小提琴。

答案 1 :(得分:1)

固定令牌

如果您尝试提取的令牌是固定长度且始终位于同一位置,则可以使用带有否定索引的substr功能:

select substr('123456',-1,6) from dual;

S
-
6

select substr('123456',-6,6) from dual;

SUBSTR
------
123456

在你的情况下,似乎令牌的长度可变。

可变长度令牌

如果您尝试提取的字符串未修复,则无法使用传统SQL或简单substr功能执行此操作。您可以使用regexp_substr。在后一种情况下,除非您确实需要一些异乎寻常的理由在Oracle中处理您的字符串,否则我建议您在应用程序中执行此操作(或仔细检查仔细对Oracle演出的正则表达式。

提议的解决方案

SELECT REGEXP_SUBSTR('B2B_BID-SKU340020201','SKU[0-9]+') FROM DUAL;