【问题标题】:ORACLE TRIM and RTRIM: the TRIM (TRAILING… ) select with more than one character?ORACLE TRIM 和 RTRIM:TRIM (TRAILING…) 选择多个字符?
【发布时间】:2018-12-03 23:33:14
【问题描述】:

为什么 lette '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;

结果:'ad' 和 'apperd'

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

我不明白为什么apperd 会出现在结果中......这应该是一条错误消息,不是吗:ORA-30001: trim set should have only one character?

我尝试了另外两个选择:

  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`

【问题讨论】:

  • 有趣。看起来很奇怪的错误。
  • @diaphol - 阅读文档 - [LTRIM](docs.oracle.com/cd/B19306_01/server.102/b14200/functions083.htm TRIM ltrim 谈论字符,trim 谈论 trim_character(single)
  • @SudiptaMondal - 这并不能解释为什么它有时不会出错。
  • 哪个版本?您的示例确实在 12.1.0.2 上给了我一个错误。
  • 我在 12.2.0.1 中看到了这种行为,但前提是“set”中的第二个字母是“m”(到目前为止,还没有彻底检查),并且只有当存在是要检查的多行;即使使用双联合的两个示例值的内联视图(但只有 1 行它会出错 - 有点像它正在为多行切换引擎盖下的功能,但不确定为什么“m”很重要。)

标签: oracle trim trailing


【解决方案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;
/

...切换执行顺序 hurls 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 在它是第一个要执行的函数时反对。

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多