【问题标题】:MySQL with IFNULL in where clauseMySQL 在 where 子句中使用 IFNULL
【发布时间】:2016-11-04 04:26:54
【问题描述】:

我有这一行的 MySQL 表:

+----------+--------+------+-------+
| list_uid | sku    | qty  | verif |
+----------+--------+------+-------+
|       49 | 024522 | 10   | 8     |
+----------+--------+------+-------+

我尝试用这个查询选择这一行:

SELECT
  *
FROM
  ae_rf_list_picked
WHERE
  `qty` != 0 AND
  IFNULL(`verif`, 0) < `qty` AND 
  `sku` = '024522' AND 
  `list_uid` = 49

我不明白为什么此查询不返回此行。 如果我删除这部分

IFNULL(verif, 0) qty AND

查询返回行。

【问题讨论】:

  • 列类型有哪些?引用手册:“IFNULL() 返回一个数字或字符串值,具体取决于使用它的上下文。” 现在,如果您使用'8'(而不是8)进行此操作,您正在检查'8' &lt; '10',这当然不是真的,因为字符串比较从左侧开始逐个字符地进行。
  • 如果您使用字符串而不是整数,您需要了解'8' 是在 '10'... 之后出现的
  • 这里是 SQL fiddle,如果列是整数,一切正常:sqlfiddle.com/#!9/34c39c/1
  • 如果您需要对其进行数学运算,请将其存储为数字。如果您永远不会对其进行数学运算,请将其存储为字符串。如果两者都需要,则需要两列。 qty 和 verif 的左对齐似乎暗示它们是文本
  • 好的,谢谢!就像你说的 qty 和 verif 的字段类型是 TINYTEXT。我明白我需要做什么,但我不明白为什么 10 之后是 8。

标签: mysql


【解决方案1】:

也许您需要将 verif 和 qty 转换为数值

假设没有小数且

SELECT *
FROM ae_rf_list_picked
WHERE `qty` != 0 
  AND cast(IFNULL(`verif`, 0) as Numeric(10)) < cast(`qty` as numeric(10))  
  AND `sku` = '024522' 
  AND `list_uid` = 49

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2014-10-22
    相关资源
    最近更新 更多