Oracle RTRIM的裁减超出了要求



有人知道为什么会这样吗:

SELECT RTRIM('123R_CLUSTER', '_CLUSTER') -- should give '123R' 
FROM DUAL;
SELECT RTRIM('123S_CLUSTER', '_CLUSTER') -- should give '123S' 
FROM DUAL;
SELECT RTRIM('123T_CLUSTER', '_CLUSTER') -- should give '123T'
FROM DUAL;
SELECT RTRIM('123U_CLUSTER', '_CLUSTER') -- should give '123U'
FROM DUAL;

是否返回"123"而不是预期的?

我在使用Oracle Database 12c Enterprise Edition 12.1.0.2.0-64位生产版。

当你尝试这些时,乐趣就开始了:

  • 将123替换为其他任何内容(没有更改仍然是错误的结果,即。多修剪一个字符)
  • 将"R"/"S"/"T"/"U"替换为其他内容,(工作正常)
  • 将"_CLUSTER"替换为其他内容,(工作正常)
  • 在"_CLUSTER"之后添加任何内容(无更改)

文档非常清楚:

Oracle/PLSQL RTRIM函数删除字符串右侧的所有指定字符。

因此,它不会删除字符串末尾的字符串_CLUSTER——它会删除字符,直到有一个不是_、C、L、U、S、t、E或R。由于您的修补程序是R/S/t/U,它们也符合rtrim条件,并且会被删除。例如123S_SLURTE也是如此。

作为一个更容易理解的例子,

rtrim('LK_123aababaabbbababbaa', 'ab') // returns LK_123

rtrim根本不是手头工作的工具:)

如果你想知道如何轻松完成这项工作,请尝试以下操作:

SELECT regexp_substr('123R_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual
union all
SELECT regexp_substr('123S_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual
union all
SELECT regexp_substr('123T_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual
union all
SELECT regexp_substr('123U_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual;

产生

REGEXP_SUBST
------------
123R
123S
123T
123U

并破译的功能

regexp_substr(
     '123T_CLUSTER',    -- source_field
     '^(.*)_CLUSTER$',  -- regular expression 
                        -- to capture all characters from start of
                        -- data up to "_CLUSTER"
     1,                 -- start looking at position 1 of string
     1,                 -- which occurance to return
     null,              -- used for match behaviour
     1)                 -- return what is in first set of parentheses

相关内容

  • 没有找到相关文章

最新更新