SQL将varchar2转换为数字

时间:2015-07-09 15:06:53

标签: sql database oracle

我的这个表X只有一列BMI。所有值都是数据类型VARCHAR2(5字节)。

BMI
---
24.81
34.23
23.21
...

问题如何将这些值转换为数字?我试过了

SELECT to_number(BMI) FROM X;

但我收到错误'无效号码',不知道为什么......

提前致谢。

2 个答案:

答案 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;