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