注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

lazydba

hello

 
 
 

日志

 
 

oracle类型隐式转换规则  

2009-06-15 11:18:14|  分类: all about databa |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
sql的where条件中,等式2边类型不一致时,数据库会做一次隐式类型转换。

比如
select * from t where char_col = num_val
会转换成这样的形式:
select * from t where to_number(char_col) = num_val

那么,这个隐式转换的规则是怎样的呢?

猜想:
Oracle会从“大”类型转换到“小”类型。

简单地说就是oracle会在char类型的值或字段上进行to_number或to_date转换。而不会在number或date上做to_char操作。

解释:
大类型的值可以表示所有小类型的值,小类型的值不能表示所有大类型的值。

比如char类型的值可以表示所有日期或数值形式的值:
'20090615', '1.23', .etc

但是反过来就不行了:
没有一个数字或日期的值可以简单地表示‘abcdefg'这个字符串。

to_char(num_val) = '123' => num_val = 123
而 to_char(num_val) = 'abcdefg' 这个方程可以认为是无解的。


一般程序里面进行的隐式类型转换都是从小类型转换到大类型,比如c语言里面int和double类型运算时,int会转换成double再计算,
而oracle在where条件里的类型转换刚好相反。

个人估计原因是这样的:当大类型的值转换为小类型的值时,可能会发生不能转换的情况,这时会报错,写程序的人就可能尽早发现错误。

测试:
这个猜想的测试非常简单。
create table t(a number, b varchar2(30), c date);

insert into t values(1, 'a', sysdate);

alter session set nls_date_format = 'yyyymmdd';
分别测试以下情况就可以了:
select * from t where a = '1';
select * from t where a = 'a';
select * from t where b = 1;
select * from t where c = '20090601';
select * from t where c = 'a';

select * from t where a = b;
select * from t where a = c;
select * from t where b = c;
.etc

date和timestamp直接的类型怎么转换?这个可以做一个测试



  评论这张
 
阅读(1692)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018