ORA-01722: 无效的数字 where 子句

Posted

技术标签:

【中文标题】ORA-01722: 无效的数字 where 子句【英文标题】:ORA-01722: invalid number where clause 【发布时间】:2020-09-29 08:02:56 【问题描述】:

当我想比较这两列时,它会显示这条消息,没有“where 子句”没有任何错误,但是当我写“Where”时会出现错误

这是我的sql语句:

select MONEY
       , to_char(MONEY, 'FM999G999G999G999D99', 'NLS_NUMERIC_CHARACTERS='',.''')  
from ACOUNT
where MONEY is not null

消息错误:ORA-01722:无效号码 01722. 00000 - “无效号码” *原因:指定的号码无效。 *操作:指定一个有效的数字。

【问题讨论】:

请告诉我们MONEY列是什么数据类型 还有,你有虚拟列吗?请附上表格结构 没有虚拟列,类型是VARCHAR2(1 BYTE) 请告诉我们您使用什么工具?可能是 SQL 开发人员? 是的,SQL developer 20.2 和数据库 11g 【参考方案1】:

您的表ACOUNT 中有MONEY 列中的非数字数据。

这是一个演示:

DEMO

我认为它在没有 where 子句时工作的原因是因为您的工具只向您显示前 50 个结果...当您添加 where 子句并过滤数据时,然后在您的前 50 个结果中是非数字数据。

您可以通过以下方式在工具中更改此设置:工具 >> 首选项 >> 数据库 >> 高级。

你可以创建这个函数:

CREATE OR REPLACE FUNCTION is_number (p_str IN VARCHAR2)
  RETURN NUMBER
IS
  l_num NUMBER;
BEGIN
  l_num := to_number(p_str);
  RETURN l_num;

EXCEPTION
  WHEN others THEN
    RETURN NULL;
END is_number;
/

我在这里创建的:How does numeric comparison on Oracle VARCHAR column work?

然后你就可以使用这个代码了:

select *
from (select MONEY_c
             , to_char(is_number(MONEY_c), 'FM999G999G999G999D99', 'NLS_NUMERIC_CHARACTERS='',.''')  as money_2
      from ACOUNT)
where money_2 is not null

【讨论】:

我不认为该变量有什么用处,尽管在那里使用它可能更容易理解代码。另外我会考虑将其声明为parallel_enable,并包括pragma udf;【参考方案2】:

它可能不仅仅是非数字字符,而只是一个逗号分隔的“数字”字符串值

这个例子导致同样的错误

select to_char('2,5', 'FM999G999G999G999D99', 'NLS_NUMERIC_CHARACTERS='',.''') from dual;

所以,这是在 ACOUNT 表中查找问题记录的查询。

select * from ACOUNT where not regexp_like(replace(MONEY, '.', ''),'^[0-9]+$');
-- replace() is here to make regexp_like to ignore values like '2.5' which can be converted to a number

【讨论】:

以上是关于ORA-01722: 无效的数字 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

SQL中,使用NVL函数,报错:ora-01722:无效数字

ORA-01722: 无效编号 当我尝试执行存储过程时。甲骨文错误

ORA-01722 运行存储过程时出错

Oracle报错ORA-01722: 无效数字排查解决方案

什么是“oracle ORA-01722”无效数字?

ORA-01722: 插入行时数字无效