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

时间:2015-02-19 23:10:00

标签: sql oracle

我有一个包含配置选项的表。值存储为字符串,但可以表示不同类型的数据。 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的记录)包含无效字符。为什么我得到一个"无效的号码"错误以及如何修复查询?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您收到错误是因为要存储使用字符串而不是使用数字的数字。要修复查询,请将字符串转换为DECODE中的数字,然后在谓词中使用该结果(条件在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