Oracle中字符串大小比较以及数据隐式转化

在Oracle数据库中单引号是用来字符串引用的,不管是数字还是时间,当你用单引号引用起来之后,数据库就会将其当成字符串来对待。
如下两句SQL:

select from users where age > 30
select from users where age > '30'

其中age字段是varchar格式,全部都是数字,不要问我既然都是数字的为什么不用num类型。
当两个语句执行的时候,发现第一个语句能准确的筛选出我们想要的结果,第二个语句虽然也可以执行,但筛选出来的结果中age比30小的也出现了。
这时候我们疑问就来了,按理来说,第二个应该才是正确的写法,为什么第二个反而得不到我们想要的结果,第一个却可以呢?

第一个问题:

select from users where age > '30'

当30加上单引号,其实就变成了两个字符串之间比较大小了。
假如有一条age的值为4,当数据库将'4'和'30'来比较大小的时候,第一步会用空格补全位数,实际比较的是'4'和’30’,然后从左至右依次比较ascii码大小,4的ascii码是52,3的ascii码是51,所以’4’就比’30’大了,也就出现在我们的筛选结果中了
如果比较的是’3’和’30’,同样的也会先去补全位数,第一位都是3然后比较第二位,第二位空格的ascii码32,0的ascii码是48,因此’3’就比’30’小了,好像没毛病,不过我们得明白其中的道理。
梳理下规则
1.用空格补全字符长度短的一方;
2.从左至右依次比较ascii码的大小

第二个问题:
第二个问题涉及到了数据隐式转换。
在oracle中,如果不同的数据类型之间关联,如果不显式转换数据,则它会根据以下规则对数据进行隐式转换。
什么意思呢,我们看上面的例子,age为varchar类型时,18为num类型,当我们执行select * from users where age > 30的时候,oracle会把age的数据类型隐式转换为num型,上面的语句其实等同于select * from users where to_number(age) > 30数字类型比较大小,当然就没问题了,所以筛选出的结果就是我们期望看到的了;
当然如果age字段里面有不能to_number的值,例如里面有一条记录age是’十八’,那么上面的语句就会报错了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 01-常量与变量 学习swift第一步打印Hello World print("Hello World") swi...
    iOS_恒仔阅读 5,440评论 2 19
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 3,243评论 2 9
  • 第一章 前端三大语言:HTML(专门编写网页内容)、CSS(编写网页样式)、JS(专门编写网页交互行为) 能简写尽...
    fastwe阅读 1,229评论 0 0
  • 听说今天天气很好,朋友圈里面阳光明媚,微博里面春暖花开,来来往往的同事也欢天喜地的跑到楼顶晒太阳。 今天,好像天气...
    萍萍_sunshine阅读 289评论 0 2
  • 老师讲了好多新知识呀!进度加快了节奏有点跟不上了!只能课后好好的复习了!留了好多的作业有点难!
    张展0407阅读 151评论 1 0

友情链接更多精彩内容