美文网首页
Oracle中字符串大小比较以及数据隐式转化

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

作者: ip小怪兽 | 来源:发表于2020-04-02 01:31 被阅读0次

在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是’十八’,那么上面的语句就会报错了。

相关文章

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

    在Oracle数据库中单引号是用来字符串引用的,不管是数字还是时间,当你用单引号引用起来之后,数据库就会将其当成字...

  • javascript中的隐式转换

    一、 运算中存在的隐式类型转换(基本类型) 简述:如果字符串不是纯数字就会转化为NAN 二、 运算中存在的隐式类型...

  • 数据类型转换1

    数据转换两种方式,隐式转换和显式转换。 字符串拼接 数学运算(+ - * /...) ==比较 显示转换 对象转换...

  • js中,关于不同类型比较,各种类型的转换原则

    在js中,‘==’进行不同类型比较,各个数据之间的转化 数字 == 字符串 2. 字符串 == 对象 将对象转化为...

  • 数据类型的强制转化和隐式转化

    数据类型的强制转化和隐式转化 隐式转化 : 计算机程序自动完成的转化,但是不会在任何时候都发生,只会在特定的情况下...

  • 08.scala隐式转换

    隐式转换 **工作中建议这么做 隐式参数 可以找到这个隐式字符串就能正常运行如有多个隐式的字符串会报错,无法选择工...

  • jJavaScript运算......

    1.隐式转换结论 (1)数字+字符串:将数字转化为字符串 (2)数字+Boolean(布尔类型):Boolean转...

  • JavaScript中的原型链与函数等问题

    数据类型 隐式转换 变量转换为字符串、===、==(类型不同,尝试转换类型再比较) 类型检测 typeof NaN...

  • js

    数据类型隐式转换。 纯数字字符串和字符串在参与数学运算时,除了加号之外,其他运算都会隐式转换。 其他数据类型参与任...

  • 笔记五

    1.数据类型转换 (1)隐式转化:当赋值号两边类型不同时,自动转化为精度较高的类型。(2)显式转化:强制类型转化,...

网友评论

      本文标题:Oracle中字符串大小比较以及数据隐式转化

      本文链接:https://www.haomeiwen.com/subject/ovdbyctx.html