我的这个表X只有一列BMI。所有值都是数据类型VARCHAR2(5字节)。
BMI
---
24.81
34.23
23.21
...
问题如何将这些值转换为数字?我试过了
SELECT to_number(BMI) FROM X;
但我收到错误'无效号码',不知道为什么......
提前致谢。
答案 0 :(得分:3)
听起来好像您正在使用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;
相关文档参考
答案 1 :(得分:2)
我假设您使用的是ORACLE PL / SQL。
我正在使用
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
试试这个:
SELECT TO_NUMBER(REPLACE (
REPLACE (BMI,
',',
(SELECT SUBSTR (VALUE, 1, 1)
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS')),
'.',
(SELECT SUBSTR (VALUE, 1, 1)
FROM NLS_SESSION_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS')
))
MY_NUMBER_CONVERTED
FROM X;