在 Oracle 数据库里,经常会碰到需要把字符类型的数据转换成数字的情况吧?比如表里有个字段存的是 “123”,但类型是 varchar2,想用来做加减运算,就必须转成数字才行。这时候很多人会想到 to_number 函数,可新手用起来,要么转换失败,要么报一堆错,不知道问题出在哪儿。今天小编就好好说说,oracle 数据库字符转数字怎么实现,详解 to_number 函数的用法,还有那些常见报错该怎么解决,新手也能看明白。
首先得知道,to_number 函数是 Oracle 里专门用来把字符转成数字的工具,基本用法其实很简单,格式大概是这样的:to_number (字符类型的数据,[格式掩码])。比如有个字符是 ‘123.45’,想转成数字,直接写 to_number (‘123.45’) 就行,运行后就能得到 123.45 这个数字。
不过要是字符里带了特殊格式,比如千分符 “,”,像 ‘1,234.56’,这时候直接转就会报错,得加上格式掩码。格式掩码就是告诉函数,这个字符里的特殊符号是啥意思,比如 to_number (‘1,234.56’, ‘9,999.99’),这里的 “9” 代表数字位,“,” 和 “.” 对应字符里的符号,这样转换就能成功了。小编第一次用的时候,就因为忘了加格式掩码,处理带千分符的字符时卡了半天,后来才明白原来得这么弄。
下面给大家列几种常见的用法,一看就懂:
- 转换整数:to_number (‘789’) → 结果是 789
- 转换带小数的:to_number (‘3.14’) → 结果是 3.14
- 转换带千分符的:to_number (‘10,000’, ‘99,999’) → 结果是 10000
但用的时候,报错是常有的事,最常见的就是 “ORA-01722: 无效数字”。为啥会出现这情况呢?多半是这几个原因:
第一个可能,字符里有非数字的内容。比如字符是 ’12a3’,里面混了个字母 “a”,to_number 函数不认识,就会报错。这时候得先检查字符里是不是有空格、字母或者其他符号,把它们处理掉才行。比如可以用 replace 函数去掉不需要的字符,像 replace (’12a3′, ‘a’, ”),先变成 ‘123’,再转换就没问题了。
第二个可能,格式掩码和字符不匹配。比如字符是 ‘123.45’,但格式掩码用了 ‘999,99’,这时候函数会觉得小数点和逗号对不上,就会报错。这时候得调整格式掩码,让它和字符的格式一致,或者先把字符处理成没有特殊符号的样子。
还有一种情况,字符是空值或者全是空格。比如字段里存的是 ” 或者 ‘ ‘,这时候用 to_number 转换,也会报无效数字的错。这时候可以先用 nvl 函数把空值换成一个默认数字,比如 nvl (字符字段,’0’),再进行转换。
给大家整个表格,看看不同错误情况和解决办法:
错误情况 | 例子 | 解决办法 |
---|---|---|
字符含非数字 | ’45b6′ | 用 replace 去掉非数字,再转换 |
格式掩码不匹配 | ‘78.90’ 用 ‘99,99’ 转换 | 改成匹配的格式掩码,如 ‘99.99’ |
字符为空或空格 | ” 或 ‘ ‘ | 用 nvl 函数替换成默认值 |
那有人可能会问,除了 to_number 函数,还有没有其他方法能把字符转成数字呢?其实还有个 cast 函数,用法是 cast (字符字段 as number),不过它的功能没有 to_number 那么灵活,遇到带特殊符号的字符,还是得先处理,不然也会报错。所以小编觉得,还是 to_number 函数更好用,尤其是处理带格式的字符时。
还有个问题,要是转换的时候,字符里的数字太大,超过了 Oracle 数字类型的范围,会怎么样呢?这时候会报 “ORA-01426: 数字溢出” 的错。这时候就得检查字符里的数字是不是太大了,或者考虑用其他类型来存储,不过这种情况不太多见,新手碰到的概率比较小。
小编觉得,用 to_number 函数转换字符到数字,关键在于确保字符里只有数字和正确的格式符号,并且格式掩码和字符的格式对得上。遇到报错的时候,别着急,先看看字符里有没有问题,再检查函数的参数对不对,一步步排查,总能找到解决办法的。刚开始用可能会觉得麻烦,多试几次,熟悉了就好了。