where子句中带有IFNULL的MySQL

where子句中带有IFNULL的MySQL,mysql,Mysql,我有一个MySQL表,其中包含这一行: +----------+--------+------+-------+ | list_uid | sku | qty | verif | +----------+--------+------+-------+ | 49 | 024522 | 10 | 8 | +----------+--------+------+-------+ 我尝试使用此查询选择此行: SELECT * FROM ae_rf_list_p

我有一个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
选择
*
从…起
ae_rf_列表_已拾取
哪里
`数量`!=0及
IFNULL(`verif`,0)<`qty`和
`sku`=“024522”和
`列表uid`=49
我不明白为什么该查询不返回此行。 如果我移除这个部分

如果为空(
verif
,0)<
数量


查询返回该行。

可能需要将verif和qty转换为数值

假设没有小数且<10个字符

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
选择*
从ae_rf_列表中选择
其中“数量”!=0
并将(IFNULL(`verif`,0)转换为数字(10))
也许您需要将verif和qty转换为数值

假设没有小数且<10个字符

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
选择*
从ae_rf_列表中选择
其中“数量”!=0
并将(IFNULL(`verif`,0)转换为数字(10))
列类型是什么?Quote manual:“IFNULL()返回一个数值或字符串值,具体取决于使用它的上下文。”现在,如果您使用
'8'
(而不是
8
)进行此操作,您将检查
'8'
,这当然不是真的,因为字符串比较是逐字符进行的,如果你使用字符串而不是整数,你需要知道
'8'
'10'
之后。下面是SQL FIDLE,如果列是整数,一切都正常:如果你需要对它进行数学运算,请将它存储为一个数字。如果你永远不会用它来做数学运算,就把它存储为字符串。如果两者都需要,则需要两列。qty和verif的左对齐似乎暗示它们是文本OK谢谢!正如您所说,Quantity和verif的字段类型是TINYTEXT。我知道我需要做什么,但我不明白为什么8在10之后。列类型是什么?Quote manual:“IFNULL()返回一个数值或字符串值,具体取决于使用它的上下文。”现在,如果您使用
'8'
(而不是
8
)进行此操作,您将检查
'8'
,这当然不是真的,因为字符串比较是逐字符进行的,如果你使用字符串而不是整数,你需要知道
'8'
'10'
之后。下面是SQL FIDLE,如果列是整数,一切都正常:如果你需要对它进行数学运算,请将它存储为一个数字。如果你永远不会用它来做数学运算,就把它存储为字符串。如果两者都需要,则需要两列。qty和verif的左对齐似乎暗示它们是文本OK谢谢!正如您所说,Quantity和verif的字段类型是TINYTEXT。我明白我需要做什么,但我不明白为什么8在10之后。