【发布时间】:2018-02-24 13:47:53
【问题描述】:
我的情况是,在数据库内部,各种双精度值都存储为字符串。
(由于某些其他原因,无法更改!)
这些数字在小数点分隔符之后和之前可以有不同数量的数字。
存储值的小数分隔符是.
数据库的默认小数分隔符将来可能会更改。
示例:
1.1
111.1
1.111
11.11
1.1111
我现在需要选择这些作为数字,以便能够比较更大或更小的值等。
因此我尝试将字符串转换为数字。我在这个答案中找到了提示:click。
不幸的是,将其用作测试:
SELECT TO_NUMBER('10.123', TRANSLATE('10.123', ' 1,234.567890', TO_CHAR(9999.9, '9G999D9') || '99999'))
FROM DUAL;
不知何故将数字转换为10123,完全删除了小数分隔,所以这个查询没有结果(只是为了验证):
SELECT * FROM(SELECT TO_NUMBER('10.123', TRANSLATE('10.123', ' 1,234.567890', TO_CHAR(9999.9, '9G999D9') || '99999')) AS NUM
FROM DUAL) WHERE NUM < 11;
所以我单步检查了单个部分,看看是否能找到错误:
SELECT TO_CHAR(9999.9, '9G999D9') FROM DUAL; -- 9.999,9
SELECT TO_CHAR(9999.9, '9G999D9') || '99999' FROM DUAL; -- 9.999,999999
SELECT TRANSLATE('10.123', ' 1,234.567890', ' 9.999,999999')
FROM DUAL; -- 99,999
SELECT TRANSLATE('10.123', ' 1,234.567890', TO_CHAR(9999.9, '9G999D9') || '99999')
FROM DUAL; -- 99,999
如您所见,我将. 作为组分隔符,将, 作为数据库的小数分隔符。
我不明白为什么它不能正确转换数字。
已经感谢您的帮助!
【问题讨论】:
-
使用
alter session set nls_numeric_characters='.,';重复您的测试,即将小数点分隔符设置为'.'