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:无效数字