【问题标题】:Using 'Greater than' operator with a negative number使用带负数的“大于”运算符
【发布时间】:2015-03-09 02:45:07
【问题描述】:

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

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

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

【问题讨论】:

  • 尝试将 SELECT 查询转换为 SIGNED:stackoverflow.com/questions/8537037/cast-decimal-to-int
  • Width 列的数据类型是什么?
  • @MichaelBerkowski - 数据类型是 VarChar(如果可能的话,我宁愿保留)
  • 好的 - 我认为 () 是负值。 MySQL(我假设是 MySQL?)并没有那样对待它们——它们被当作字符串处理。如果您不介意使用 REPLACE() 进行一些字符串操作,则可以处理。
  • @ChayaCooper 我明白了,昨天发表评论后我离开了我的电脑。你需要 CAST() 他们 - 我在下面充实了它。

标签: mysql negative-number comparison-operators


【解决方案1】:

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

由于您正在使用VARCHAR() 类型并且更喜欢继续使用VARCHAR,RDBMS 没有正确地将() 包含的值视为负数,而是尝试将字符串转换为整数(这会导致零,并且比较不正确)。

解决 () 封闭的否定:

使用()-封闭的负值,您可以REPLACE() 开头(-REPLACE() 结尾) 什么都没有,从而产生类似-0.70 的值,但是它仍然是 MySQL 的 string。然后您必须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:

【讨论】:

    【解决方案2】:

    您强制进行文本比较

    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

    【讨论】:

    • '-.80' 转换为SIGNED将产生0
    • 这在我删除括号时有效(手动或使用@MichaelBerkowski的解决方案),所以它解释了为什么我突然不能做我以前做过的事情;-)在路上派上用场:-)
    猜你喜欢
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2014-02-03
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多