Sql 选择查询失败ORA-01722(无效数字)作为有效数字

Sql 选择查询失败ORA-01722(无效数字)作为有效数字,sql,oracle,Sql,Oracle,我有一个表,其中包含配置选项。这些值存储为字符串,但可以表示不同类型的数据。TYPE列标识值的数据类型。(字符串、整数、浮点或布尔值之一) 我正在尝试运行一个包含数字比较的查询,例如 SELECT NAME, VALUE FROM CONFIG WHERE TYPE = 'INTEGER' AND to_number(VALUE) > 100 但我的查询以“ORA-01722:无效号码”失败。所有值(对于整数类型的记录)均不包含无效字符。为什么会出现“无效数字”错误以及如何修复查询?SQ

我有一个表,其中包含配置选项。这些值存储为字符串,但可以表示不同类型的数据。
TYPE
列标识值的数据类型。(字符串、整数、浮点或布尔值之一)

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

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

但我的查询以“ORA-01722:无效号码”失败。所有值(对于整数类型的记录)均不包含无效字符。为什么会出现“无效数字”错误以及如何修复查询?

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

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

假设这不是一个选项,您需要保护对
到\u number
的呼叫。您可以使用CASE子句来实现这一点

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

出现错误是因为在存储数字时使用了字符串而不是数字。若要修复查询,请在
解码中将字符串转换为数字,然后在谓词中使用该结果(WHERE子句中的条件)

有关更多详细信息,请参阅有人提出类似问题的链接:

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