【问题标题】:SELECT query failing with ORA-01722 (invalid number) for valid numbersSELECT 查询失败,ORA-01722(无效数字)有效数字
【发布时间】:2015-04-21 12:44:07
【问题描述】:

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

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


    【解决方案1】:

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

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

    假设您不需要保护对to_number 的调用。您可以使用 CASE 子句来做到这一点。

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

    【讨论】:

      【解决方案2】:

      您收到错误是因为您使用字符串而不是数字来存储数字。要修复您的查询,请将字符串转换为 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

      【讨论】:

        猜你喜欢
        • 2020-01-01
        • 2021-10-30
        • 2018-10-12
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 2019-02-14
        • 1970-01-01
        • 2017-05-04
        相关资源
        最近更新 更多