【发布时间】:2016-04-14 17:54:30
【问题描述】:
在oracle sql中,
TO_NUMBER('1,000.98', '9,999.99') 给出的答案为1000.98。 //第 1 行
TO_NUMBER('1,000.98', '9999.99') 也给出了1000.98 的答案。 //line2
尽管格式字符串与给定字符串不匹配,为什么 line2 不给出错误?(格式字符串没有逗号)
【问题讨论】:
在oracle sql中,
TO_NUMBER('1,000.98', '9,999.99') 给出的答案为1000.98。 //第 1 行
TO_NUMBER('1,000.98', '9999.99') 也给出了1000.98 的答案。 //line2
尽管格式字符串与给定字符串不匹配,为什么 line2 不给出错误?(格式字符串没有逗号)
【问题讨论】:
Oracle 文档在我的国家/地区被禁止,因此我无权访问它。
但是在非官方教程中很明显,如果您使用 TO_NUMBER 函数而不使用第三个参数(NLS_Params),它将忽略所有非数字字符并显示数字并仅识别点( .) 作为小数点的表示法。
如果您希望它识别数字中使用的所有其他可能的格式字符(例如 , 表示千位分隔符),您也必须使用第三个参数。
正确的形式是:
TO_NUMBER('1,000.98', '9999.99', 'nls_numeric_characters=''.,''')
有好的答案的类似问题在这里:
希望对你有帮助。
【讨论】:
TO_NUMBER 文档有点令人困惑:
TO_NUMBER将 expr 转换为 NUMBER 数据类型的值。 expr 可以是 BINARY_DOUBLE 值或 CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的值包含可选格式模型 fmt 指定格式的数字。
尽管如此Oracle只关心在进行转换时来自源字符串的小数分隔符所以它忽略了数千组标记,依此类推。 这种行为似乎没有记录在任何地方。
分隔符标记由NLS_NUMERIC_CHARACTERS设置。
NLS_NUMERIC_CHARACTERS选项指定十进制标记和 会话的千组标记。
对于最安全的转换,请考虑CAST:
SQL> SELECT CAST('1000,98' as DECIMAL(10,2)) as TO_NUMBER FROM DUAL;
TO_NUMBER
----------
1000,98
【讨论】: