ORACLE TRIM和RTRIM:TRIM(TRAILING ...)选择多个字符?

dia*_*hol 10 oracle trim trailing

为什么lette'm'在以下查询中扮演特殊角色?我试图创建一个TRIM函数,我坚持使用它.或者:当我从双表和另一个表查询时有什么不同.

例如

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

create table x
(col1 varchar2(20));
insert into x values ('adam');
insert into x values ('apperda');
Run Code Online (Sandbox Code Playgroud)

然后我选择TRIM(TRAILING ...)和RTRIM如下:

select 
col1,
trim(trailing 'am' from col1) traling,
rtrim(col1, 'am') rtim
from x;
Run Code Online (Sandbox Code Playgroud)

结果是:'ad'和'apperd'

COL1                 TRALING              RTIM                
-------------------- -------------------- --------------------
adam                 ad                   ad                  
apperda              apperd               apperd              
Run Code Online (Sandbox Code Playgroud)

我不明白为什么apperd会出现结果......这应该是一条错误信息,不应该是这样的:ORA-30001:trim set应该只有一个字符?

我尝试了另外两个选择:

  1. 删除了选择的修剪(尾随...)部分.

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

    select
    trim(trailing 'am' from 'apperda'),
    from dual;
    
    Run Code Online (Sandbox Code Playgroud)

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

ORA-30001:修剪集应该只有一个字符

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

我创建一个简单的查询,apperda它显示错误:

select 
trim(trailing 'am' from 'apperda') traling,
rtrim('apperda', 'am') rtim
from dual
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

select中的第一行应该给出错误ORA-30001,因为trim中有两个字符(尾随...).但脚本运行:

TRIM(TRAILING'AM'FROMCOL)   RTRIM(COL,'AM')
-----------------------------------------------
dre                         dre
Run Code Online (Sandbox Code Playgroud)

并且:看起来修剪(trailin ...)取决于rtrim(...) - 如果你擦除rtrim(...),错误信息应该出现.

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

APC*_*APC 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;
/
Run Code Online (Sandbox Code Playgroud)

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

select
    rtrim(col, 'am')
    , trim(trailing 'am' from col)
from trims;
/
Run Code Online (Sandbox Code Playgroud)

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

select
    trim(trailing 'am' from col)
    , rtrim(col, 'ax')
from trims;
/
Run Code Online (Sandbox Code Playgroud)

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