第145章 SQL函数 TO_NUMBER

等等,我昨天刚帮隔壁老王搞懂这个函数。
他店铺收银系统老是乱,客户扫个带字母的优惠券码,系统就卡死。
后来发现是字符串转数字那块出了问题。

记得那天下午三点,我蹲在税务局旁边的咖啡店,对着电脑屏幕试了半天。
输入'1 2 .3 4 abc',TO_NUMBER居然返回1 2 .3 4 ,把老王逗乐了,他拿纸巾擦着嘴角说:"这函数比我家大黄还听话,大黄叼回的快递单它都认。
"
突然想到,转换空字符串时有个怪事。
我在Oracle 1 9 c上测试,''返回0,但在1 2 c上提示错误。
查官方文档说这是版本bug,建议用COALESCE先处理空值。
当时老王说:"那不如直接在SQL加1 ?" 我就笑了,这老哥的思路。

现在想想,要是老王早知道EXTRACT函数,或许能更省事。
但那天他坚持要用TO_NUMBER,说"客户看着顺眼"。
结果呢,现在系统连他孙子画的奥特曼优惠券都能识别,就差没把隔壁花店送的玫瑰折算成折扣了。

等等,还有个事。
转换科学计数法时,'1 .2 3 E3 '在LOGICAL模式下会变成1 2 3 0.00,而在显示模式下是1 2 3 0.00。
这点老王特别满意,说"这样报表好看"。
我就琢磨着,这数字转换里头,还真藏着不少打印优化的小门道。

今天路过小学,看见几个小朋友在玩数字积木。
有个小丫头把'0.5 '和'1 '拼在一起,结果变成了'01 '。
她妈妈说:"这丫头学我们用电脑,总把数字当拼音打。
"等等,这场景跟老王收银台前的优惠券码似的。
数字和字符串之间,隔着个好玩又让人头疼的转换层。

对了,老王最近又买了台新电脑,说是要学Python。
我随口说:"那字符串转数字的函数,Python也有啊。
"他眼睛一亮:"真的?能自动去掉字母的?" 我说:"试试看,但Python的NULL处理比Oracle复杂多了。
" 他就嘿嘿笑,也不知是怕麻烦还是真有信心。

现在天快黑了,路过菜市场。
卖菜的大爷正在用扫码枪扫土豆,屏幕上"5 .9 9 /kg"后面跟着个"土豆ABC"的标签码。
我突然想,要是这个码能让收银系统自动算折扣,那TO_NUMBER函数可就立大功了。
可惜现在只能按原价收,大爷还嘀咕:"现在的年轻人,连土豆都要搞个VIP码。
"
不知道老王的Python学得怎么样了,那字符串转数字的问题,Python能比Oracle更聪明点吗?

SQL Server中如何把 科学记数法字符串 变为 数字字符串

结论:SQL Server中,将科学记数法字符串转换为数字字符串,直接使用CONVERT(FLOAT, @科学记数法字符串)即可。

例子1 :将科学记数法字符串‘1 .2 3 E+1 0’转换为整数字符串。
时间:2 02 3 年4 月5 日 地点:上海 代码: sql DECLARE @Number NVARCHAR(5 0) = N'1 .2 3 E+1 0'; SELECT CONVERT(NVARCHAR(5 0), CONVERT(FLOAT, @Number));
结果:1 2 3 00000000
例子2 :将科学记数法字符串‘1 .2 3 4 5 6 7 8 9 E+5 ’转换为保留两位小数的字符串。
时间:2 02 3 年4 月5 日 地点:北京 代码: sql DECLARE @Number NVARCHAR(5 0) = N'1 .2 3 4 5 6 7 8 9 E+5 '; SELECT CONVERT(NVARCHAR(5 0), CONVERT(FLOAT, @Number));
结果:1 2 3 4 5 6 .7 9
注意:如果你需要控制小数位数,可以在CONVERT(FLOAT, @Number)后直接跟CAST来指定小数位数。

oracle保留两位小数

哈,这看起来像是在处理一些数值格式化的问题,对吧?我之前也遇到过类似的场景。

上周有个客人问我,怎么把数字格式化成特定的样子,比如保留两位小数,但是总感觉数字后面会有很多零。
他给我看了个例子,是这样的:
sql select to_char(to_number('.2 '), '9 9 9 9 9 9 9 9 9 9 0.9 9 ') from dual;
然后他又问我:
sql select to_char(to_number('1 2 3 4 5 6 .2 6 6 6 '), '9 9 9 9 9 9 9 9 9 9 0.9 9 ') from dual;
我一开始有点懵,后来想想,这应该是Oracle数据库里的函数to_char和to_number在起作用。
to_char是用来格式化数字的,而to_number则是将字符串转换为数字。
这里的.2 和9 9 9 9 9 9 9 9 9 9 0.9 9 应该是用来控制数字的格式。

比如说,如果你输入的是1 2 3 4 5 6 .2 6 6 6 ,那么格式化后的结果就会是1 2 3 4 5 6 .2 7 ,因为.2 意味着只保留两位小数,而第三位小数是6 ,所以四舍五入成7
不过,这个格式化看起来有点奇怪,因为9 9 9 9 9 9 9 9 9 9 0.9 9 这个格式字符串,我猜它可能是用来确保数字至少有1 0位整数部分和2 位小数部分,如果不足,就会在前面补零。
不过,这只是一个猜测,因为我没在实际环境中测试过。

反正你看着办,如果你需要更精确的答案,可能得去查查Oracle的官方文档。
我还在想这个问题呢。