我的情况是,在数据库内部,各种双精度值都存储为字符串。
(由于某些其他原因,这无法更改!)
数字在小数点分隔符之后和之前可以有不同数量的数字。存储值
的小数点分隔符是 a数据库的默认小数点分隔符将来可能会更改。.
例子:
1.1
111.1
1.111
11.11
1.1111
我现在需要选择这些作为数字,以便能够比较更大或更小的值等。
因此我尝试将字符串转换为数字。我在这个答案中找到了一个提示:点击。
不幸的是,使用它作为测试:
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
正如你所看到的,我得到了一个.
作为组分隔符和一个,
作为数据库的小数分隔符。
我不明白为什么它不能正确转换数字。
感谢您的帮助!
尝试使用这个版本的to_number
TO_NUMBER( string1 [, format_mask] [, nls_language])
例如:
SELECT to_number('1.1111','9G990D00000', 'NLS_NUMERIC_CHARACTERS = ''.,''') FROM DUAL
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句