为什么在以下查询中字母“ 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:修剪集应该只包含一个字符?
我尝试了另外两个选择:
删除了所选内容的修剪(尾部)部分。
select
col1,
trim(trailing 'am' from col1) traling
from x;
从双重选择
select
trim(trailing 'am' from 'apperda'),
from dual;
两个查询都给我错误信息:
ORA-30001:修饰集只能包含一个字符
查询中的加号行提供加号信息吗?或怎么可能?而且这不仅是一个查询问题,而且似乎两个数据(adam
和apperda
)相互作用:
我使用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`
答案 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就会抛出异常。