日期:2014-05-17  浏览次数:20823 次

一个oracle字符处理函数的简单问题
数据库是   oracle   10g
例如下面一句(等号右边的字符串含有一串空格)
select   1   from   dual   where   'aaaa '   =   'aaaa               '  
运行结果会有一条记录返回

然而
select   1   from   dual   where   trim( 'aaaa ')   =   'aaaa               '  
这样就没有记录返回
同样ltrim,rtrim,substr   都有这样的现象

谁能说说为什么?


------解决方案--------------------
trim当然是去掉空格了嘛
------解决方案--------------------
我觉得是oracle先针对 'aaaa '和 'aaaa '生成了对应的类似char类型的定长字符串。
然后作比较。
由于char类型不足位数本身就用空格补足,所以比较的时候相等。
相当于 'aaaa '= 'aaaa '
但是加了trim以后,情况就不同了。
相当于 'aaaa '= 'aaaa '所以结果不同。
------解决方案--------------------
似乎是oracle的bug,看了一下执行计划,
select 1 from dual where 'aaaa ' = 'aaaa '

SELECT STATEMENT, GOAL = CHOOSE
TABLE ACCESS FULL Object owner=SYS Object name=DUAL


select 1 from dual where trim( 'aaaa ') = 'aaaa '

SELECT STATEMENT, GOAL = CHOOSE
FILTER
TABLE ACCESS FULL Object owner=SYS Object name=DUAL
根本不存在filter操作
------解决方案--------------------
我同意doer_ljy(可战) 的观点!
在 'aaaa ' = 'aaaa ' 比较的时候,1位字长和4000个字长是相等的.
trim则要执行截取判定了。