【问题标题】:SQL convert varchar2 to numberSQL 将 varchar2 转换为数字
【发布时间】:2015-07-09 15:06:52
【问题描述】:

我有这张表 X,只有一列,BMI。所有值的数据类型均为 VARCHAR2(5 字节)。

BMI
---
24.81
34.23
23.21
...

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

SELECT to_number(BMI) FROM X;

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

提前致谢。

【问题讨论】:

  • 您使用的是什么关系型数据库?请添加相关标签

标签: sql database oracle


【解决方案1】:

听起来您使用的是 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;

相关文档参考

【讨论】:

  • 是的,确实在我的数据库中它正在返回,。与.相反,非常感谢! :)
【解决方案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;

【讨论】:

  • 感谢您的解决方案,它也很有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2011-02-11
  • 1970-01-01
相关资源
最近更新 更多