我有一张只有一列的X表,BMI。所有值都是varchar2(5字节)数据类型。
BMI
---
24.81
34.23
23.21
...
如何将这些值转换为数字?我试过了
SELECT to_number(BMI) FROM X;
但我得到了错误的“无效号码”,不知道为什么…
提前谢谢。
最佳答案
听起来确实像是在使用Oracle数据库(varchar2
日期类型…)
如果是这样,则会话的NLS_NUMERIC_CHARACTERS
nls参数似乎有一个意外值。
您可以通过查询来检查当前拥有的内容
select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';
在我的数据库中,它返回一个值
.,
,其中第一个字符.
表示Oracle期望的十进制字符(在本例中,第二个字符,
用于确定组分隔符)。如果您的数据库返回一组不同的2个字符,那么这就解释了为什么它不能将您的值解析为数字。有两种选择:
考虑更改会话的
NLS_NUMERIC_CHARACTERS
nls参数:ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'; -- set '.' as the decimal character for this session.
这样做之后,您就可以按照您已经尝试过的方式调用
TO_NUMBER
了。或者,可以向
TO_NUMBER
函数调用添加其他参数,以强制该调用使用正确的十进制字符。像这样的:SELECT to_number(BMI, '99D99', 'NLS_NUMERIC_CHARACTERS = ''.,''') FROM X;
相关文件参考
TO_NUMBER Function
Number Format Models
NLS_NUMERIC_CHARACTERS