【发布时间】:2015-07-09 15:06:52
【问题描述】:
我有这张表 X,只有一列,BMI。所有值的数据类型均为 VARCHAR2(5 字节)。
BMI
---
24.81
34.23
23.21
...
问题如何将这些值转换为数字?我试过了
SELECT to_number(BMI) FROM X;
但我收到错误“无效号码”,不知道为什么...
提前致谢。
【问题讨论】:
-
您使用的是什么关系型数据库?请添加相关标签
我有这张表 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;
相关文档参考
【讨论】:
我假设您使用的是 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;
【讨论】: