Sql Oracle中下划线和下划线之后的子字符串

Sql Oracle中下划线和下划线之后的子字符串,sql,oracle,substring,instr,Sql,Oracle,Substring,Instr,我有一个分数不足的字符串和一些字符。我需要应用子字符串并在左侧获取值,不包括下划线。因此,我应用了下面的公式,它可以正确地处理那些带有下划线(\ux)的字符串。但是对于不带(_)的字符串,它会带来NULL。任何关于如何在子字符串本身中处理此问题的建议 例:ABC_BASL-->工作正常;ABC--->给出空值 我的公式如下- select SUBSTR('ABC_BAS',1,INSTR('ABC_BAS','_')-1) from dual; ABC select SUBSTR('ABC',

我有一个分数不足的字符串和一些字符。我需要应用子字符串并在左侧获取值,不包括下划线。因此,我应用了下面的公式,它可以正确地处理那些带有下划线(\ux)的字符串。但是对于不带(_)的字符串,它会带来NULL。任何关于如何在子字符串本身中处理此问题的建议

例:ABC_BASL-->工作正常;ABC--->给出空值

我的公式如下-

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

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

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

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

您可以使用
大小写
表达式首先检查下划线:

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;

使用正则表达式匹配:

SELECT REGEXP_SUBSTR('ABC_BAS', '(.*)([_]|$)?', 1, 1, NULL, 1) FROM DUAL;
返回“ABC”,并且

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

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

SELECT REGEXP_SUBSTR('ABC_BAS', '[^_]*') FROM DUAL;
返回
“ABC”
,与此相同

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

另一种方法是在
substr
的长度参数中使用
解码
,如下所示:

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

您似乎希望所有内容都在第一个
'
之前。如果是这样,一种方法使用
regexp\u replace()

更简单的方法是:

select regexp_substr(str, '^[^_]+')
from (select 'ABC' as str from dual union all
      select 'ABC_BAS' from dual
     ) s
是一把小提琴。

我会用它

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

您需要将
的通配符下划线转义为like
-(并且您的CTE缺少
union all
*8-)。
NULL
根据您的描述似乎是正确的。你想要什么?
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