SELECT查询失败,并显示ORA-01722(无效数字)有效数字

Mic*_*man 2 sql oracle

我有一个表,其中包含配置选项。这些值存储为字符串,但可以表示不同类型的数据。该TYPE列标识值的数据类型。(STRING,INTEGER,FLOAT或BOOLEAN中的一种)。

CREATE TABLE CONFIG (
    NAME  VARCHAR2(256) NOT NULL,
    TYPE  VARCHAR2(20)  NOT NULL,
    VALUE VARCHAR2(1024)
)
Run Code Online (Sandbox Code Playgroud)

我正在尝试运行包含数字比较的查询,例如

SELECT NAME, VALUE FROM CONFIG
WHERE TYPE = 'INTEGER' AND to_number(VALUE) > 100
Run Code Online (Sandbox Code Playgroud)

但我的查询失败,并显示“ ORA-01722:无效编号”。这些值(对于INTEGER类型的记录)均不包含无效字符。为什么会出现“无效数字”错误,我该如何解决查询问题?

Mic*_*man 5

SQL并未定义谓词(WHERE子句的条件)的评估顺序。这样的查询是否“有效”取决于服务器选择的执行计划。对查询的影响计划的更改可能导致此错误在没有明显原因的情况下出现和消失。

最好的解决方案是不要将数字数据存储在字符串(VARCHAR)字段中。

假设这不是您的选择,则需要保护对的调用to_number。您可以使用CASE子句来做到这一点。

SELECT NAME, VALUE FROM CONFIG
WHERE (
  CASE TYPE WHEN 'INTEGER'
  THEN to_number(VALUE)
  ELSE NULL
  END) > 100
Run Code Online (Sandbox Code Playgroud)