sql—在oracle中从下划线开始的子字符串

t5zmwmid  于 2021-07-26  发布在  Java
关注(0)|答案(6)|浏览(321)

我有一个分数不足的字符串和一些字符。我需要应用子字符串并在左边获取值,不包括下划线。所以我应用了下面的公式,并且它对那些有下划线(\的字符串正确工作。但是对于没有(\的字符串,它会带来null。任何关于如何在子字符串本身中处理的建议。
例如:\ U basl--->工作正常;--->给出空值
我的公式如下-

select SUBSTR('ABC_BAS',1,INSTR('ABC_BAS','_')-1) from dual;
ABC

select SUBSTR('ABC',1,INSTR('ABC','_')-1) from dual;
(NULL)
wpcxdonn

wpcxdonn1#

你需要一个 CASE 要首先检查下划线的表达式:

WITH yourTable AS (
    SELECT 'ABC_BAS' AS col FROM dual UNION ALL
    SELECT 'ABC' FROM dual
)

SELECT
    CASE WHEN col LIKE '%\_%' ESCAPE '\'
         THEN SUBSTR(col, 1, INSTR(col, '_') - 1)
         ELSE col END AS col_out
FROM yourTable;
yqlxgs2m

yqlxgs2m2#

使用正则表达式匹配:

SELECT REGEXP_SUBSTR('ABC_BAS', '(.*)([_]|$)?', 1, 1, NULL, 1) FROM DUAL;

返回“”,并且

SELECT REGEXP_SUBSTR('ABC', '(.*)([_]|$)?', 1, 1, NULL, 1) FROM DUAL;

还返回“”。
db<>在这里摆弄

编辑

上面给出了正确的结果,但我错过了最简单的正则表达式:

SELECT REGEXP_SUBSTR('ABC_BAS', '[^_]*') FROM DUAL;

退货 'ABC' ,也一样

SELECT REGEXP_SUBSTR('ABC', '[^_]*') FROM DUAL;

db<>在这里摆弄

anhgbhbe

anhgbhbe3#

另一种方法是使用 DECODEsubstr 具体如下:

substr(str, 
       1, 
       decode(instr(str,'_'), 0, lenght(str), instr(str,'_') - 1)
       )
eivnm1vs

eivnm1vs4#

你好像想把一切都安排到第一个 '_' . 如果是这样,一种方法使用 regexp_replace() :

select regexp_replace(str, '(^[^_]+)_.*$', '\1')
from (select 'ABC' as str from dual union all
      select 'ABC_BAS' from dual
     ) s

更简单的方法是:

select regexp_substr(str, '^[^_]+')
from (select 'ABC' as str from dual union all
      select 'ABC_BAS' from dual
     ) s

这是一把小提琴。

mm5n2pyu

mm5n2pyu5#

我会用

regexp_replace(text,'_.*')

或者如果性能是个问题,

substr(text, 1, instr(text||'_', '_') -1)

例如,

with demo(text) as
   ( select column_value
     from   table(sys.dbms_debug_vc2coll('ABC', 'ABC_DEF', 'ABC_DEF_GHI')) )
select text
     , regexp_replace(text,'_.*')
     , substr(text, 1, instr(text||'_', '_') -1)
from   demo;

TEXT         REGEXP_REPLACE(TEXT,'_.*') SUBSTR(TEXT,1,INSTR(TEXT||'_','_')-1)
------------ --------------------------- -------------------------------------
ABC          ABC                         ABC
ABC_DEF      ABC                         ABC
ABC_DEF_GHI  ABC                         ABC
nwwlzxa7

nwwlzxa76#

好的,我想我明白了。将nvl添加到子字符串并插入如下条件-

select nvl(substr('ABC',1,instr('F4001Z','_')-1),'ABC') from dual;

相关问题