Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle ORA-01722:由于WHERE为NULL条件而出现无效数字错误_Sql_Oracle_Isnull - Fatal编程技术网

Sql Oracle ORA-01722:由于WHERE为NULL条件而出现无效数字错误

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

我有以下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
它是如何相关的,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
,不如使用。