Sql Oracle ORA-01722:由于WHERE为NULL条件而出现无效数字错误
我有以下SQL:Sql Oracle ORA-01722:由于WHERE为NULL条件而出现无效数字错误,sql,oracle,isnull,Sql,Oracle,Isnull,我有以下SQL: Select MyNumber FROM (SELECT to_number(Name) AS MyNumber FROM TableA WHERE regexp_replace(Name, '\d+') IS NULL) 该查询应该通过检查是否没有留下任何内容,是否所有数字都被替换为无内容,从而从表A中过滤出非数字名称 有人能解释一下为什么我在添加以下WHERE条件作为外部WHERE时会出现“无效数字”异常: WHERE MyNumber IS NULL
Select MyNumber
FROM (SELECT to_number(Name) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '\d+') IS NULL)
该查询应该通过检查是否没有留下任何内容,是否所有数字都被替换为无内容,从而从表A中过滤出非数字名称
有人能解释一下为什么我在添加以下WHERE条件作为外部WHERE时会出现“无效数字”异常:
WHERE MyNumber IS NULL
它是如何相关的,MyNumber是什么类型?特别是,我还想知道,当我否定条件时,为什么我没有得到错误:
WHERE NOT MyNumber IS NULL
提前感谢您的帮助。我可以复制您看到的内容,但是我得到了
为空或为非空的错误:
create table tablea (name) as
select '123' from dual
union all select 'abc123' from dual
union all select 'abc123def456,' from dual
union all select '1abc123def456,' from dual;
SELECT MyNumber
FROM (
SELECT to_number(Name) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '\d+') IS NULL
);
MYNUMBER
----------
123
SELECT MyNumber
FROM (
SELECT to_number(Name) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '\d+') IS NULL
)
WHERE mynumber IS NULL;
ORA-01722: invalid number
SELECT MyNumber
FROM (
SELECT to_number(Name) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '\d+') IS NULL
)
WHERE mynumber IS NOT NULL;
ORA-01722: invalid number
您可能可以添加提示,使其以不同的方式处理,但您可以添加另一个正则表达式,这样任何未命中转换的非数值都不会导致问题:
SELECT MyNumber
FROM (
SELECT to_number(regexp_replace(Name, '[^[:digit:]]')) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '[[:digit:]]+') IS NULL
);
MYNUMBER
----------
123
SELECT MyNumber
FROM (
SELECT to_number(regexp_replace(Name, '[^[:digit:]]')) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '[[:digit:]]+') IS NULL
)
WHERE mynumber IS NULL;
no rows selected
SELECT MyNumber
FROM (
SELECT to_number(regexp_replace(Name, '[^[:digit:]]')) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '[[:digit:]]+') IS NULL
)
WHERE mynumber IS NOT NULL;
MYNUMBER
----------
123
正如@MrLlama指出的,使用类似于regexp\u的,这会更干净一些:
SELECT MyNumber
FROM (
SELECT to_number(regexp_replace(Name, '[^[:digit:]]')) AS MyNumber
FROM TableA
WHERE regexp_like(Name, '^[[:digit:]]+$')
);
得到相同的结果(包括原始错误)
查询应该从表A中筛选出非数字名称
你为什么不用这样的东西呢
SQL> with test (name) as
2 (select '12345' from dual union
3 select 'abc123' from dual union
4 select 'lksfj' from dual union
5 select 'ping pong' from dual
6 )
7 select name
8 from test
9 where regexp_like(name, '^\d+$');
NAME
---------
12345
SQL>
这可能需要进行一些调整,具体取决于NAME
列真正包含的内容。如果您使用的是Oracle 12cR2,那么DEFAULT…on CONVERSION ERROR
第一个查询运行正常吗?(to_number()不会出错)。只是一个提示,与其使用REGEXP_REPLACE
,不如使用。