首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Oracle SQL中选择不超过特定字符的子字符串?

如何在Oracle SQL中选择不超过特定字符的子字符串?
EN

Stack Overflow用户
提问于 2010-12-09 00:06:32
回答 6查看 597.7K关注 0票数 84

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

ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore

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

ABC
DEFGH
IJKLMNOP

SUBSTRING函数似乎无法完成任务,因为它是基于位置的,并且下划线的位置是不同的。

我想到了TRIM函数(特别是RTRIM函数):

SELECT RTRIM('listofchars' FROM somecolumn) 
FROM sometable

但我不确定如何让它工作,因为它似乎只删除了特定的字符列表/集,而我实际上只是在寻找通向下划线字符的字符。

EN

回答 6

Stack Overflow用户

发布于 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

Instr documentation

Susbtr Documentation

票数 7
EN

Stack Overflow用户

发布于 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;

主机

票数 6
EN

Stack Overflow用户

发布于 2010-12-09 00:38:09

另一种可能性是使用REGEXP_SUBSTR.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4389571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档