Oracle RTRIM削减了超过要求

时间:2015-10-27 15:27:51

标签: sql oracle oracle12c

有谁知道为什么这些:

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企业版12.1.0.2.0版 - 64位生产版。

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

  • 用其他任何东西替换123(没有改变仍然错误的结果,即 修剪一个角色),
  • 用其他任何东西替换“R”/“S”/“T”/“U”,(工作正常)
  • 用其他任何东西替换“_CLUSTER”,(工作正常)
  • 在“_CLUSTER”之后添加任何内容(无更改)。

2 个答案:

答案 0 :(得分:3)

文档很清楚:

  

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根本不是手头工作的工具:)

答案 1 :(得分:0)

如果你想知道如何轻松地做到这一点,试试这个:

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