0

我有一个低于分数和一些字符的字符串。我需要应用子字符串并获取左侧的值,不包括下划线。所以我应用了下面的公式,它对那些有下划线(_)的字符串正常工作。但是对于没有 (_) 的字符串,它会带来 NULL。任何关于如何在子字符串本身中处理的建议。

例如:ABC_BASL ---> 工作正常;ABC ---> 给出 null

我的公式如下 -

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

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

6 回答 6

4

您可以使用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;
于 2020-06-20T03:06:54.377 回答
3

使用正则表达式匹配:

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

返回“ABC”,并且

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

也返回“ABC”。

db<>在这里摆弄

编辑

以上给出了正确的结果,但我错过了最简单的正则表达式来完成这项工作:

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

返回'ABC', 一样

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

db<>在这里摆弄

于 2020-06-20T03:37:51.927 回答
2

另一种方法是使用如下DECODE的长度参数substr

substr(str, 
       1, 
       decode(instr(str,'_'), 0, lenght(str), instr(str,'_') - 1)
       )
于 2020-06-20T03:55:31.683 回答
1

您似乎希望一切都达到第一个'_'。如果是这样,一种方法使用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

是一个 db<>fiddle。

于 2020-06-20T11:22:26.540 回答
1

我会用

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
于 2020-06-20T17:05:26.717 回答
0

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

select nvl(substr('ABC',1,instr('F4001Z','_')-1),'ABC') from dual;
于 2020-06-20T03:05:43.353 回答