ORACLE TRIM和RTRIM:TRIM(TRAILING…)选择的字符不止一个吗?

时间:2018-06-25 11:41:54

标签: oracle trim trailing

为什么在以下查询中字母“ m”扮演特殊角色?我试图创建一个TRIM函数,但我一直坚持下去。或者:当我从对偶表和另一个表中查询时有什么区别。

例如

我创建了一个包含一列和两个值(“ adam”和“ apperda”)的表

create table x
(col1 varchar2(20));
insert into x values ('adam');
insert into x values ('apperda');

然后我按如下所示选择TRIM(TRAILING…)和RTRIM:

select 
col1,
trim(trailing 'am' from col1) traling,
rtrim(col1, 'am') rtim
from x;

结果为:“广告”和“包装”

COL1                 TRALING              RTIM                
-------------------- -------------------- --------------------
adam                 ad                   ad                  
apperda              apperd               apperd              

我不明白为什么apperd出现在结果中……这应该是一条错误消息,不是吗:ORA-30001:修剪集应该只包含一个字符?

我尝试了另外两个选择:

  1. 删除了所选内容的修剪(尾部)部分。

    select
    col1,
    trim(trailing 'am' from col1) traling
    from x;
    
  2. 从双重选择

    select
    trim(trailing 'am' from 'apperda'),
    from dual;
    

两个查询都给我错误信息:

  

ORA-30001:修饰集只能包含一个字符

查询中的加号行提供加号信息吗?或怎么可能?而且这不仅是一个查询问题,而且似乎两个数据(adamapperda)相互作用:

我使用apperda创建一个简单查询,并显示错误:

select 
trim(trailing 'am' from 'apperda') traling,
rtrim('apperda', 'am') rtim
from dual
  

ORA-30001:修饰集只能包含一个字符


核心示例(2018-07-05)

create table trims
(col varchar2(20));

insert into trims values ('dream');

select
    trim(trailing 'am' from col)
    rtrim(col, 'am')
from trims;

选择的第一行应该给出错误ORA-30001,因为trim(trailing ...)中有两个字符。但是脚本运行:

TRIM(TRAILING'AM'FROMCOL)   RTRIM(COL,'AM')
-----------------------------------------------
dre                         dre

而且:似乎trim(trailin ...)取决于rtrim(...)-如果擦除rtrim(...),则错误消息应该照原样出现。

select
    trim(trailing 'am' from col)
    --rtrim(col, 'am')
from trims;
`ORA-30001: trim set should have only one character`

1 个答案:

答案 0 :(得分:1)

我想知道这是否是某些内核优化的副作用。实际上,trim(trailing 'am' from col)rtrim(col, 'am')是相同的操作。如此看来,如果我们执行rtrim(col, 'am')的第二秒,Oracle不会打扰trim(trailing 'am' from col),而只是返回rtrim()的结果。

因此,当这些查询返回修剪后的结果时...

select
    trim(trailing 'am' from col)
    , rtrim(col, 'am')
from trims;
/

select
    trim(trailing 'ax' from col)
    , rtrim(col, 'ax')
from trims;
/

...切换执行顺序会ORA-30001: trim set should have only one character

select
    rtrim(col, 'am')
    , trim(trailing 'am' from col)
from trims;
/

提供不同的值进行修剪也是如此:

select
    trim(trailing 'am' from col)
    , rtrim(col, 'ax')
from trims;
/

这个理论的一个障碍是Oracle执行从左到右运行的功能。因此,当无效的trim()是查询中最右边的函数调用时,当我们期望Oracle在执行第一个函数时会反对时,Oracle就会抛出异常。