有人知道为什么会这样吗:
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