mysql - 使用带负数的 'Greater than' 运算符

标签 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

最佳答案

最简单的解决方案当然是使用 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'

Example in action

在 VARCHAR 列中使用常规负值

如果将它们更改为常规负数但保留 VARCHAR类型,您不需要所有嵌套的 REPLACE()但您仍然需要将其转换为 DECIMAL(10,2) .

SELECT Width
FROM T3
WHERE 
  CAST(Width AS DECIMAL(10,2)) > '-0.8'

Example 2:

关于mysql - 使用带负数的 'Greater than' 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28934515/

相关文章:

ruby - 带有比较语句的 Ruby 中的 NoMethodError

php - 如何在之前的 MySQL 操作中获取受影响的行?

java - SQLException "No value specified for parameter 3"

java - 创建一个可以计算数组中负数的方法

凯撒密码负数问题

javascript - 在 JavaScript 中创建 deepEqual 函数

mysql - 可以使用 SELECT 查询,但不能使用它来创建新表

php - 如何在 mySQL 的 REGEXP 中添加 PHP 变量

c - C中负数右移

c++ - const_iterator 与迭代器的比较是否定义明确?