sql - 甲骨文 ORA-01722 : invalid number Error because of WHERE IS NULL Condition

标签 sql oracle isnull

我有以下 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/

相关文章:

mysql - NOT IN 子句和 NULL 值

oracle - 使用 VPN 连接到 Oracle

mysql - 在 MySQL 数据库中使用 ISNULL(example,0) 时,COALESCE 和 IFNULL 不返回 0

mysql - MySql 查询中的 COUNT()、GROUP BY 和 NULL 值

sql - 使用带有 NOT EXISTS 的 INNER JOIN Access INSERT 语句会给出错误的结果

sql - Postgresql 将两个表的 SUM 值与相同的列组合在一起

mysql - 无法运行 mysql count (*)

xml - 当标签的 url 部分时如何提取 Oracle XML

Oracle Insert 返回 ORA-01400

postgresql - 如何正确解析 postgresql 中的迭代器?