如何在Oracle SQL中选择一个特定字符的子字符串?

时间:2010-12-08 16:06:32

标签: sql oracle substring trim

假设我有一个表格列,结果如下:

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

我希望能够编写一个从所述表中选择此列的查询,但只返回子字符串直到Underscore(_)字符。例如:

ABC
DEFGH
IJKLMNOP

SUBSTRING功能似乎不适合任务,因为它是基于位置的,下划线的位置也不同。

我想到了TRIM功能(特别是RTRIM功能):

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

但是我不确定我是如何让它工作的,因为它似乎只删除某个列表/一组字符而且我只是在导致Underscore字符的字符之后。

8 个答案:

答案 0 :(得分:126)

使用SUBSTR,INSTR和NVL的组合(对于没有下划线的字符串)将返回您想要的内容:

SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
  FROM DUAL

结果:

output
------
ABC

使用:

SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
  FROM YOUR_TABLE t

参考:

附录

如果使用Oracle10g +,您可以通过REGEXP_SUBSTR使用正则表达式。

答案 1 :(得分:36)

这可以使用 REGEXP_SUBSTR 轻松完成。

请使用

REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 

其中 STRING_EXAMPLE 是您的字符串。

尝试:

SELECT 
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
from dual

它将解决您的问题。

答案 2 :(得分:7)

您需要获取第一个下划线的位置(使用INSTR),然后使用substr将第一个字符串的部分字符串获取到(pos-1)。

  1  select 'ABC_blahblahblah' test_string,
  2         instr('ABC_blahblahblah','_',1,1) position_underscore,
  3         substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result
  4*   from dual
SQL> /

TEST_STRING      POSITION_UNDERSCORE RES
---------------- ------------------  ---
ABC_blahblahblah                  4  ABC

Instr documentation

Susbtr Documentation

答案 3 :(得分:5)

SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)  from dual

是正确的答案,由user1717270发布

如果您使用INSTR,它将为您提供一个字符串的位置,该字符串假定其中包含“_”。如果没有怎么办?那么答案将是0.因此,当您想要打印字符串时,它将打印NULL。 示例:如果要从“host.domain”中删除域。在某些情况下,您只有短名称,即“主机”。很可能你想打印“主机”。好吧,使用INSTR它会给你一个NULL,因为它没有找到任何“。”,即它会从0到0打印。使用REGEXP_SUBSTR你会得到正确答案所有情况:

SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1)  from dual;

HOST

SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1)  from dual;

HOST

答案 4 :(得分:2)

另一种可能性是使用REGEXP_SUBSTR.

答案 5 :(得分:0)

如果列中的所有字符串都没有下划线,请记住这一点 (...或者如果null值将是输出):

SELECT COALESCE
(SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), 
"STRING_COLUMN") 
AS OUTPUT FROM DUAL

答案 6 :(得分:0)

从大字符串中查找任何子字符串:

string_value:=('This is String,Please search string 'Ple');

然后从'Ple'找到字符串String_value,我们可以这样做:

select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;

您会找到结果:Ple

答案 7 :(得分:0)

如果String位置不固定,则在Select语句下面,我们可以获得预期的输出。

表结构 ID VARCHAR2(100字节) 客户端VARCHAR2(4000 BYTE)

数据- ID CLIENT
1001 {“ clientId”:“ con-bjp”,“ clientName”:“ ABC”,“ providerId”:“ SBS”}
1002 {“ IdType”:“ AccountNo”,“ Id”:“ XXXXXXXX3521”,“ ToPricingId”:“ XXXXXXXX3521”,“ clientId”:“ Test-Cust”,“ clientName”:“ MFX”}

要求-在“客户”列中搜索“ ClientId”字符串并返回相应的值。像从“ clientId”:“ con-bjp”-> con-bjp(预期输出)

选择CLIENT,substr(substr(CLIENT,instr(CLIENT,'“ clientId”:“')+ length('” clientId“:”')),1,instr(substr(CLIENT,instr(CLIENT,' TEST_SC中的“ clientId”:“')+ length('” clientId“:”')),'“',1)-1)cut_str;

客户cut_str -------------------------------------------------- --------- ---------- {“ clientId”:“ con-bjp”,“ clientName”:“ ABC”,“ providerId”:“ SBS”} con-bjp {“ IdType”:“ AccountNo”,“ Id”:“ XXXXXXXX3521”,“ ToPricingId”:“ XXXXXXXX3521”,“ clientId”:“ Test-Cust”,“ clientName”:“ MFX”} Test-Cust