Oracle 中to_number ()函数的⽤法
类似于mysql
⽤就可,但要填适当的类型,⽰例:
select (11 as unsigned int) /*整型*/
select (11 as decimal(10,2)) /**/oracle decimal类型
(1)将char 或varchar2类型的string 转换为⼀个number 类型的数值,
需要注意的是,被转换的字符串必须符合数值类型格式,如果被转换的
字符串不符合数值型格式,将抛出错误提⽰;
(2)to_number 和to_char 恰好是两个相反的函数;
to_number(varchar2 or char,'格式')
(2)如果数字在格式范围内的话,就是正确的,否则就是错误的;如:
(3)可以⽤来实现进制转换;16进制转换为10进制:[sql]
01. select  to_number('000012134') from  dual;  02. select  to_number('88877') from  dual;  [sql]
01. select  to_number('$12345.678', '$999999.99') from  dual;  02. select  to_number('$12345.678', '$999999.999') from  dual;  [sql]
01. select  to_number('19f','xxx') from  dual;  02. select  to_number('f','xx') from  dual;
1 ⽤法简介
TO_NUMBER 函数()是中常⽤的类型转换函数之⼀,主要是将字符串转换为数值型的格式,与TO_CHAR()函数的作⽤正好相反。To_number 函数的格式如下:
To_number 函数中也有很多预定义的固定格式:
格式值
含义9
代表⼀个数字0
强迫0显⽰$显⽰美元符号
L
强制显⽰⼀个当地的货币符号.显⽰⼀个⼩数点
To_number (varchar2 or char ,’format  model’)
1
,显⽰⼀个千位分隔符号格式值含义
2 ⼀些例⼦
3 ⽤法陷阱
有的时候你会发现,使⽤了TO_NUMBER()函数并且语法正确,但是Oracle 却报“invalid number”的错误,⽽你在⼀遍⼜⼀遍认认真真检查并确定语句⽆误之后⼤呼惊奇,以为TO_NUMBER()函数还有什么可能不知道的⽤法。其实这很可能是你所查询的数据出现了问题,⽽⾮SQL 。使⽤TO_NUMBER()函数的时候,⼀定要确保所转换字段是可转换为数字的,⽐如字符串“20151008”是可以转换为数字20
151008的,但是字符串“2015-10-08”不可以。如果你的字段中包含了字符串“2015-10-08”,⽽你还直接使⽤了TO_NUMBER()函数进⾏操作的话就会报“invalid number”的错。
4 逃出陷阱
如何逃出陷阱呢?
1 前端校验
尽量在⽤户输⼊的时候进⾏必要的校验,确保输⼊的数值就是我们需要的格式。
2 后台校验
在后台代码中进⾏必要的检查,筛选到错误的值并且传给前台合理的提⽰。
3 SQL 校验
⼀旦你的数值进了,问题就变得复杂了。还有⼀种情况是,数据是历史的,我们不能修改它,但是还要进⾏必要的查询。这时候就需要在SQL 层⾯做点什么了。假设需要使⽤TO_NUMBER()函数的字段是varchar2类型的名为“status”。⽐如,如果⾮法数据都是⽐较长的,你可以在SQL 中加上长度的校验,即多加⼀个where 条件:
或者,也可以将⾮法字符替换掉,,同样是在where 中多加⼀个条件:
实例中REGEXP_REPLACE()将“status”字段中所有⾮数字的字符替换为空字符,然后再⽤TO_NUMBER()进⾏⽐较就可以啦!SQL> select  to_number (’RMB234234.4350′,’L999999.0000′) from  dual;    TO_NUMBER (’RMB234234.4350′,’L999999.0000′)    ——————————————    234234.4351
2
3
4
SQL> select  to_number (’$123,233,455,623.3400′,’$999,999,999,999.0000′) from dual;    TO_NUMBER (’$123,233,455,623.3400′,’$999,999,999,999.0000′)    ———————————————————-    1.2323E+11
1
2
3
4LENGTH(status) <= 10
1TO_NUMBER(REGEXP_REPLACE(status,'[^0-9]','')) > 30
1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。