Sql Oracle-选择*where列>;5.
我试图根据一个专栏做一个比较。比方说,如果列>5Sql Oracle-选择*where列>;5.,sql,oracle,ora-01722,Sql,Oracle,Ora 01722,我试图根据一个专栏做一个比较。比方说,如果列>5 select * where column>5 该列包含非数字。我认为Oracle允许比较字符串(如Java) 显然这是不允许的 ORA-01722: invalid number 01722. 00000 - "invalid number" 有没有办法与非数字字段进行比较? 谢谢您错过了表格: select * where FROM tablename column>5 但这仅在列为数字时有效。如果没有,则不能使用 要比
select * where column>5
该列包含非数字。我认为Oracle允许比较字符串(如Java)
显然这是不允许的
ORA-01722: invalid number
01722. 00000 - "invalid number"
有没有办法与非数字字段进行比较?谢谢您错过了表格:
select * where FROM tablename column>5
但这仅在列为数字时有效。如果没有,则不能使用
要比较字符串,您可以使用
如
或STRCMP()
,检查它们的示例
如@Gerrat所述,您还可以使用
和如果缺少表格:
select * where FROM tablename column>5
但这仅在列为数字时有效。如果没有,则不能使用
要比较字符串,您可以使用如
或STRCMP()
,检查它们的示例
如@Gerrat所述,您也可以使用
和是的,您必须将这5个字符加引号:
select * from table where column > '5'
是的,你必须把这5个加引号:
select * from table where column > '5'
您可以使用来\u char
函数
select * from table where column > to_char(5)
您可以使用来\u char
函数
select * from table where column > to_char(5)
如果列为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参数(例如,当您将此活动付诸实施时)可能会产生您不期望的产品结果,并且这些结果与您在环境中获得的结果不匹配
您应该使用number
列来保存数值,date
列来保存日期等,varchar2
仅用于保存文本值。如果列是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参数(例如,当您将此活动付诸实施时)可能会产生您不期望的产品结果,并且这些结果与您在环境中获得的结果不匹配
您应该使用number
列来保存数值,date
列来保存日期等等,varchar2
仅用于保存文本值。更清楚地说明它为什么不起作用
当使用数字文字5
而不是字符文字'5'
时,Oracle执行隐式数据类型转换,并尝试将表中的所有值转换为数字。这就是为什么你会犯这样的错误
您应该永远不要依赖隐式数据类型转换。那肯定会给你带来麻烦
现在,如果您正确地将字符文本('5'
)与字符列进行比较,则不需要数据类型转换,也不会发生错误
然而:如果您期望Oracle实际执行数字比较,那么您就错了。字符串基于ASCII值。因此,(字符)值'10'
低于(字符)值'2
,因为第一个字符'1'
的排名低于'2'
来解释为什么它不起作用
当使用数字文字5
而不是字符文字'5'
时,Oracle执行隐式数据类型转换,并尝试将表中的所有值转换为数字。这就是为什么你会犯这样的错误
您应该永远不要依赖隐式数据类型转换。那肯定会给你带来麻烦
现在,如果您正确地将字符文本('5'
)与字符列进行比较,则不需要数据类型转换,也不会发生错误
然而:如果您期望Oracle实际执行数字比较,那么您就错了。字符串基于ASCII值。因此,(字符)值'10'
低于(字符)值'2
,因为第一个字符'1'
的排名低于'2'
您可以在Oracle中使用类似“>”的字符串比较。它符合您的期望。@aF,请看这里:@Gerrat:不一定是您期望的,因为'10'比'2'小。@a_horse_,没有名称:嗯,这可能不是一些人期望的,但我敢打赌,aF
会期望进行词汇比较:)您可以在Oracle中使用类似'>'的字符串比较。它做了你所期望的。@aF,请看这里:@Gerrat:不一定是你所期望的,因为“10”比“2”小。一匹没有名字的马:嗯,这可能不是一些人所期望的,但我会