如何在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_value
findstring'Ple'
,我们可以这样做:
select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;
你会find结果: Ple