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

Pre*_*zel 77 sql oracle substring trim

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

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Run Code Online (Sandbox Code Playgroud)

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

ABC
DEFGH
IJKLMNOP
Run Code Online (Sandbox Code Playgroud)

SUBSTRING函数似乎不适合任务,因为它是基于位置的,并且下划线的位置不同.

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

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable
Run Code Online (Sandbox Code Playgroud)

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

OMG*_*ies 132

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

SELECT NVL(SUBSTR('ABC_blah', 0, INSTR('ABC_blah', '_')-1), 'ABC_blah') AS output
  FROM DUAL
Run Code Online (Sandbox Code Playgroud)

结果:

output
------
ABC
Run Code Online (Sandbox Code Playgroud)

使用:

SELECT NVL(SUBSTR(t.column, 0, INSTR(t.column, '_')-1), t.column) AS output
  FROM YOUR_TABLE t
Run Code Online (Sandbox Code Playgroud)

参考:

附录

如果使用Oracle10g +,则可以通过REGEXP_SUBSTR使用regex .

  • 如果针对不包含您正在查找的子字符串的值运行,则会失败.如果你有`INSTR('ABC/D','_')`,`instr`会返回0.最后你有一个从0到(0-1)的子串,它是null.不好. (9认同)

use*_*270 36

这可以使用REGEXP_SUBSTR轻松完成.

请用

REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
Run Code Online (Sandbox Code Playgroud)

其中STRING_EXAMPLE是你的字符串.

尝试:

SELECT 
REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) 
from dual
Run Code Online (Sandbox Code Playgroud)

它会解决你的问题.


Raj*_*thi 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
Run Code Online (Sandbox Code Playgroud)

Instr文档

Susbtr文档


小智 6

SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1)  from dual
Run Code Online (Sandbox Code Playgroud)

是正确的答案,由用户1717270发布

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

SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1)  from dual;
Run Code Online (Sandbox Code Playgroud)

主办

SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1)  from dual;
Run Code Online (Sandbox Code Playgroud)

主办