我有一张只有一列的X表,BMI。所有值都是varchar2(5字节)数据类型。

BMI
---
24.81
34.23
23.21
...

如何将这些值转换为数字?我试过了
SELECT to_number(BMI) FROM X;

但我得到了错误的“无效号码”,不知道为什么…
提前谢谢。

最佳答案

听起来确实像是在使用Oracle数据库(varchar2日期类型…)
如果是这样,则会话的NLS_NUMERIC_CHARACTERSnls参数似乎有一个意外值。
您可以通过查询来检查当前拥有的内容

select value
from nls_session_parameters
where parameter = 'NLS_NUMERIC_CHARACTERS';

在我的数据库中,它返回一个值.,,其中第一个字符.表示Oracle期望的十进制字符(在本例中,第二个字符,用于确定组分隔符)。如果您的数据库返回一组不同的2个字符,那么这就解释了为什么它不能将您的值解析为数字。
有两种选择:
考虑更改会话的NLS_NUMERIC_CHARACTERSnls参数:
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

07-24 19:05