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

问题描述 投票:2回答:2

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

CREATE TABLE CONFIG (
    NAME  VARCHAR2(256) NOT NULL,
    TYPE  VARCHAR2(20)  NOT NULL,
    VALUE VARCHAR2(1024)
)

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

SELECT NAME, VALUE FROM CONFIG
WHERE TYPE = 'INTEGER' AND to_number(VALUE) > 100

但我的查询失败,“ORA-01722:无效数字”。没有值(对于类型为INTEGER的记录)包含无效字符。为什么我收到“无效号码”错误,如何修复查询?

sql oracle
2个回答
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

0
投票

您收到错误是因为要存储使用字符串而不是使用数字的数字。要修复查询,请将字符串转换为DECODE中的数字,然后在谓词中使用THAT结果(WHERE子句中的条件)。

SELECT NAME,
  VALUE
FROM CONFIG
WHERE TYPE  = 'INTEGER'
AND DECODE ( (REPLACE(TRANSLATE(TRIM(VALUE),'0123456789','00000000000'),'0' ,NULL)), NULL, to_number(trim(VALUE)) ) > 100;

有关更多详细信息,请参阅有人提出类似问题的链接:https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:11504677087008

© www.soinside.com 2019 - 2024. All rights reserved.