我在使用TO_NUMBER函数的第二个和第三个参数时遇到了问题。它们中的一个依赖于另一个吗?nls_params参数是如何工作的?我不明白查询结果是怎么回事
SELECT TO_NUMBER('17.000,23',
'999G999D99',
'nls_numeric_characters='',.'' ')
REFORMATTED_NUMBER
FROM DUAL; 可以是17000.23。有人能解释一下上述转换的过程吗?
附注:上述查询摘自Oracle Database SQL Expert证书准备一书。
发布于 2011-10-26 15:37:52
现在,我将回答我自己的问题。在使用TO_NUMBER函数时,我忽略了一个要点,那就是无论我从TO_NUMBER函数中得到什么,都将是一个数字。数字不包括小数点和E科学记数法以外的任何东西。所以17,788.99实际上不是一个数字,而是17788.99的字符串表示。
如果我们试图从17,788.99中减去500,我们将失败。( Oracle隐式地将数字字符串转换为数字,反之亦然,但基本上我们不能在字符串和数字之间执行算术操作)。我敢肯定,TO_NUMBER函数几乎从不用来选择列值。它是用来做算术运算的。相反,我们使用TO_CHAR以一种整洁、易于阅读的格式显示列值或任何数字表达式。fomat模型和nls_params不仅适用于TO_NUMBER函数,也适用于TO_CHAR。
发布于 2011-10-26 15:34:21
您告诉TO_NUMBER函数,nls_numeric_characters中的两个字符,.表示小数和千位分隔符
G (thousands seperator) = .
D (decimal seperator) = ,所以它认为这个数字是一万七千二十三。
请参阅:http://download.oracle.com/docs/cd/B13789_01/olap.101/b10339/x_stddev022.htm#i78653
https://stackoverflow.com/questions/7898953
复制相似问题