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应该只有一个字符?
我尝试了另外两个选择:
删除了选择的修剪(尾随...)部分.
select
col1,
trim(trailing 'am' from col1) traling
from x;
Run Code Online (Sandbox Code Playgroud)从双重选择
select
trim(trailing 'am' from 'apperda'),
from dual;
Run Code Online (Sandbox Code Playgroud)这两个查询都给我错误信息:
ORA-30001:修剪集应该只有一个字符
查询中的加号行提供加信息?或者它是如何可能的?它不仅仅是一个查询问题,而且似乎两个数据(adam和apperda)相互作用:
我创建一个简单的查询,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)
Run Code Online (Sandbox Code Playgroud)`ORA-30001: trim set should have only one character`
我想知道这是否是某些内核优化的副作用。有效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 在它是第一个要执行的函数时提出反对。