1

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

select * where column>5

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

显然这是不允许的。

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

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

4

5 回答 5

5

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

select * from table where column > '5'
于 2012-07-31T13:43:32.987 回答
3

如果列是varchar2,那么:

select * from some_table where some_column > 5

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

select * from some_table where to_number(some_column) > 5

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

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

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

于 2012-07-31T14:01:38.633 回答
3

更清楚地说明它为什么不起作用。

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

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

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

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

于 2012-07-31T14:03:44.390 回答
1

你可以使用to_char功能

select * from table where column > to_char(5)
于 2012-07-31T14:00:56.253 回答
0

你错过了这张桌子:

select * where FROM tablename column>5

但这仅在 column 是数字时才有效。如果没有,则不能使用>.


要比较字符串,您可以使用LIKEor ,在此处STRCMP()查看它们的示例。


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

请注意,在文本比较中,它将单独比较每个字符,因此“11”将小于“2”。

于 2012-07-31T13:42:29.343 回答