我在使用TO_NUMBER函数第二个和第三个参数时遇到问题。其中一个是否依赖另一个? nls_params参数如何工作?我无法理解查询结果如何
SELECT TO_NUMBER('17.000,23',
'999G999D99',
'nls_numeric_characters='',.'' ')
REFORMATTED_NUMBER
FROM DUAL;
可以是17000.23。有人可以解释一下上述转换的过程。
P.S。以上查询来自Oracle数据库SQL专家证书准备书。
答案 0 :(得分:5)
你告诉TO_NUMBER
函数,
nls_numeric_characters中的两个字符,.
表示小数和千位分隔符
G (thousands seperator) = .
D (decimal seperator) = ,
所以它看到这个数字是17000点二十三。
请参阅:http://download.oracle.com/docs/cd/B13789_01/olap.101/b10339/x_stddev022.htm#i78653
答案 1 :(得分:1)
现在,我将回答我自己的问题。在使用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
。