我有一个表,其中包含配置选项。值存储为字符串,但可以表示不同类型的数据。 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没有定义谓词(WHERE子句的条件)的计算顺序。此类查询是否“有效”取决于服务器选择的执行计划。对查询影响计划的更改可能会导致此错误出现并消失,没有明显原因。
最佳解决方案是不将数字数据存储在字符串(VARCHAR)字段中。
假设这不是一个选项,你需要保护对to_number
的调用。您可以使用CASE子句执行此操作。
SELECT NAME, VALUE FROM CONFIG
WHERE (
CASE TYPE WHEN 'INTEGER'
THEN to_number(VALUE)
ELSE NULL
END) > 100
您收到错误是因为要存储使用字符串而不是使用数字的数字。要修复查询,请将字符串转换为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