使用带有负数的“大于”运算符

时间:2015-03-09 02:45:08

标签: mysql negative-number comparison-operators

我需要对包含正数和负数的列运行多个查询,并返回<>的所有行而不是选定的值,但是当我使用时它不会返回预期的结果如果所选值为负数,则为“大于”运算符。

请注意,当所选值为负数时,它应返回正数和负数,并且似乎从结果中排除负数。

SELECT T3.*    
FROM Rules T3
WHERE T3.Width > '-.80';

T3.Width中包含的值是:

  

0.90,(0.70),(0.70),(0.70),(0.70),(1.00),(1.00),(1.00),(1.00),(0.90),(0.55),(0.50)

因此结果应为:

  

0.90,(0.70),(0.70),(0.70),(0.70),(0.55),(0.50)

但是返回的结果是:

  

0.90

2 个答案:

答案 0 :(得分:1)

最简单的解决方案当然是使用表格中的DECIMAL()FLOAT列。

由于您正在使用VARCHAR()类型并且更愿意继续使用VARCHAR,因此RDBMS未正确将()个封闭值视为否定值,而是尝试将字符串强制转换为一个整数(导致零和不正确的比较)。

解决()所附的否定词:

使用() - 附加的否定值,REPLACE() (开场- REPLACE())结束-0.70没有,导致像< >这样的值,但它仍然是MySQL的字符串。然后,您必须CAST it to a decimal value进行SELECT Width FROM T3 WHERE /* Replace the ( to -, and the ) with nothing * then cast it to a decimal value */ CAST(REPLACE(REPLACE(Width, '(', '-'), ')', '') AS DECIMAL(10,2)) > '-0.8' 比较。

VARCHAR

Example in action

使用VARCHAR列中的常规负值

如果您将其更改为常规负数但保留REPLACE()类型,则不需要所有嵌套DECIMAL(10,2),但您仍需要将其转换为SELECT Width FROM T3 WHERE CAST(Width AS DECIMAL(10,2)) > '-0.8' }。

{{1}}

Example 2:

答案 1 :(得分:1)

你强制进行文字比较

SELECT T3.*    
FROM Rules T3
WHERE T3.Width > -.80;

使用数字比较,'-.80'-.80的差异只是引号。

当您按数值进行比较时,查询将返回预期结果

如果您必须使用引号,请使用CAST('-.80' AS DECIMAL(12,2))

这给出2个小数位和10个数字,对于大多数演员来说应该足够了,但如果需要的话可以调整

  

如果比较操作中的两个参数都是字符串,则它们是   比较为字符串。

http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html