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

如何在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值