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