如何在Oracle SQL中select一个子string到特定的字符?

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

ABC_blahblahblah DEFGH_moreblahblahblah IJKLMNOP_moremoremoremore 

我想能够写一个查询从表中select此列,但只返回子string到下划线(_)字符。 例如:

 ABC DEFGH IJKLMNOP 

SUBSTRING函数似乎没有达到任务,因为它是基于位置的,并且下划线的位置是变化的。

我想到了TRIMfunction(特别是RTRIMfunction):

 SELECT RTRIM('listofchars' FROM somecolumn) FROM sometable 

但是我不确定我怎样才能使这个工作,因为它似乎只是删除了一个特定的列表/字符集,而且我真的只是在通向Underscore字符的字符之后。

使用SUBSTR,INSTR和NVL(对于没有下划线的string)的组合将返回你想要的:

 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 

参考:

  • SUBSTR
  • INSTR

附录

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

这可以使用REGEXP_SUBSTR轻松完成。

请用

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

STRING_EXAMPLE是你的string。

尝试:

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

它会解决你的问题。

您需要获取第一个下划线的位置(使用INSTR),然后使用substr从第一个string获取string部分(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文档

Susbtr文档

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

是正确的答案,由user1717270发布

如果你使用INSTR ,它会给你一个string的位置,假设它包含“_”。 如果没有? 那么答案是0.因此,当你想打印string,它会打印一个NULL 。 例如:如果您想从“host.domain”中删除域。 在某些情况下,您只能使用短名称,即“主机”。 最有可能你想打印“主机”。 那么,用INSTR它会给你一个NULL因为它没有find任何“。”,即它将打印从0到0.随着REGEXP_SUBSTR你会得到正确的答案在所有情况下:

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

主办

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

主办

另一种可能性是使用REGEXP_SUBSTR。

请记住,如果列中的所有string没有下划线(…或者如果空值将是输出):

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

从大string查找任何子string:

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

然后从String_valuefindstring'Ple' ,我们可以这样做:

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

你会find结果: Ple