假设我有一个表列,其结果如下:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
我希望能够编写一个从所述表中选择该列的查询,但只返回子字符串直到下划线(_)字符。例如:
ABC
DEFGH
IJKLMNOP
SUBSTRING函数似乎无法完成任务,因为它是基于位置的,并且下划线的位置是不同的。
我想到了TRIM函数(特别是RTRIM函数):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
但我不确定如何让它工作,因为它似乎只删除了特定的字符列表/集,而我实际上只是在寻找通向下划线字符的字符。
发布于 2010-12-09 00:10:00
您需要获取第一个下划线的位置(使用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
发布于 2015-05-24 05:07:24
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
是正确的答案,由user1717270发布
如果你使用INSTR
,它会给你一个字符串的位置,假设字符串中包含"_“。如果不是呢?那么答案将是0。因此,当您想要打印字符串时,它将打印一个NULL
。示例:如果您想要从"host.domain“中删除域名。在某些情况下,您将只使用缩写名称,即"host“。您很可能想要打印"host“。嗯,对于INSTR
,它会给你一个NULL
,因为它没有找到任何".",也就是说,它将从0打印到0。使用REGEXP_SUBSTR
,您将在所有情况下获得正确的答案:
SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1) from dual;
主机
和
SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1) from dual;
主机
发布于 2010-12-09 00:38:09
另一种可能性是使用REGEXP_SUBSTR.
https://stackoverflow.com/questions/4389571
复制相似问题