我有以下 SQL:
Select MyNumber
FROM (SELECT to_number(Name) AS MyNumber
FROM TableA
WHERE regexp_replace(Name, '\d+') IS NULL)
查询应该通过检查是否没有留下任何内容以及所有数字是否被替换为任何内容来从 TableA 中过滤掉非数字名称。
有人可以解释为什么当我将以下 WHERE 条件添加为外部 WHERE 时出现“无效数字”异常:
WHERE MyNumber IS NULL
它有什么关系,MyNumber 是什么类型?特别是,我还想知道,当我否定条件时,为什么我没有收到错误消息:
WHERE NOT MyNumber IS NULL
在此先感谢您的帮助。
最佳答案
我可以在某种程度上复制您所看到的内容,但我得到的错误是is null
或 is not 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_like
会更简洁一些:
SELECT MyNumber
FROM (
SELECT to_number(regexp_replace(Name, '[^[:digit:]]')) AS MyNumber
FROM TableA
WHERE regexp_like(Name, '^[[:digit:]]+$')
);
得到相同的结果(包括您原来的错误)。
关于sql - 甲骨文 ORA-01722 : invalid number Error because of WHERE IS NULL Condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51270055/