Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle-选择*where列>;5._Sql_Oracle_Ora 01722 - Fatal编程技术网

Sql Oracle-选择*where列>;5.

Sql 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 但这仅在列为数字时有效。如果没有,则不能使用 要比

我试图根据一个专栏做一个比较。比方说,如果列>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”小。一匹没有名字的马:嗯,这可能不是一些人所期望的,但我会