【问题标题】:Oracle - select * where column>5Oracle - 选择 * where column>5
【发布时间】:2012-07-29 07:11:30
【问题描述】:

我正在尝试基于列进行比较。比方说,如果列> 5。

select * where column>5

该列包含非数字。我认为 Oracle 允许比较字符串(如 Java)。

显然这是不允许的。

ORA-01722: invalid number
01722. 00000 -  "invalid number"

有没有办法与非数字字段进行比较?
谢谢

【问题讨论】:

    标签: sql oracle ora-01722


    【解决方案1】:

    你错过了这张桌子:

    select * where FROM tablename column>5
    

    但这仅适用于列是数字的情况。如果没有,则不能使用>


    要比较字符串,您可以使用LIKESTRCMP(),查看它们的示例HERE


    正如@Gerrat 所说,您也可以使用><,但双方的类型必须兼容(数字与数字或文本与文本)。要了解更多信息,请查看THIS

    请注意,在文本比较中,它将单独比较每个字符,因此 '11' 将是

    【讨论】:

    • 您可以在 Oracle 中将“>”之类的比较与字符串一起使用。它符合您的预期。
    • @Gerrat:不一定是你所期望的,因为 '10' 小于 比 '2'
    • @a_horse_with_no_name:嗯,这可能不是 一些 人所期望的,但我敢打赌 aF 会期望进行词汇比较 :)
    【解决方案2】:

    是的,您必须将 5 放在引号中:

    select * from table where column > '5'
    

    【讨论】:

    • 请记住,比较字符串时,'5' > '40'true。这就是为什么将数字数据存储为字符串通常是一个坏主意的原因。
    【解决方案3】:

    你可以使用to_char函数

    select * from table where column > to_char(5)
    

    【讨论】:

      【解决方案4】:

      如果列是varchar2,那么这个:

      select * from some_table where some_column > 5
      

      ... 将所有列值隐式转换为数字,所以你真的在做:

      select * from some_table where to_number(some_column) > 5
      

      这是导致 ORA-01722 的 to_number(),即使您看不到它,但当它遇到一个非数字值时。对列值调用的函数也会停止使用任何索引(有点过于简单了)。

      您可以阻止它失败,如果有索引,则让它使用索引,方法是像其他人所说的那样执行 where some_column > '5'where some_column > to_char(5)。但是您需要小心进行比较,因为它仍然是字符串比较,而不是数字比较;所以'10'不会被视为> '5';并且您的 NLS 排序参数可能会产生您不期望的结果。或者更重要的是,其他人的 NLS 参数(例如,当您将其上线时)可能会产生您不期望的结果,并且与您在环境中获得的结果不匹配。 See the documentation for more.

      您应该使用number 列来保存数值,date 列来保存日期等,而varchar2 只用来保存文本值。

      【讨论】:

        【解决方案5】:

        更多地阐明它为什么不起作用。

        当使用数字文字 5 而不是字符文字 '5' 时,Oracle 会进行隐式数据类型转换并尝试将表中的所有值转换为数字。这就是为什么你得到那个错误。

        您应该永远依赖隐式数据类型转换。这一定会给你带来麻烦。

        现在,如果您正确地将字符文字 ('5') 与字符列进行比较,则无需进行数据类型转换,也不会发生错误。

        但是:如果您希望 Oracle 实际进行数字比较,那么您就错了。字符串基于 ASCII 值。因此,(字符)值'10'低于(字符)值'2',因为第一个字符'1' 的排名低于'2'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多