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