奇怪的MySQL行为进行比较

时间:2014-12-29 14:19:45

标签: php mysql null

我发现question可能会解释我得到的结果。但这仍然是一种奇怪的行为。

我们有一个充满供应商产品的表格,每天都会更新(从xml读取新数据)。 “已更新”列会在此过程中获取新的日期时间值。从供应商xml文件中消失的产品应在“flag”

列中标记为EOL

从xml文件导入后,我按照SQL运行,尝试查找应标记为EOL的产品。

SELECT * FROM `app_supplier_products` WHERE `flag` != 'EOL' AND `supplier_id` = 1 AND `updated` < '2014-12-29 07:15:01'

然而,这没有返回任何行。如果我们将时间改为07:15:15,我们确实得到了结果。看起来比较小的比较没有从另一天返回行。

在做了一些其他测试后,我们设法让它使用以下SQL:

SELECT * FROM `app_supplier_products` WHERE (`flag` IS NULL OR `flag` = 'MODIFIED') AND `supplier_id` = 1 AND `updated` < '2014-12-29 07:15:01'

此时,标志列可以是NULL,MODIFIED或EOL。将来我们可能会添加其他可能的值。这意味着我们在添加其他值时必须更新所有查询。

为什么第一个查询不返回预期的行?

1 个答案:

答案 0 :(得分:1)

将查询更改为:

SELECT * FROM `app_supplier_products` WHERE NOT (`flag` <=> 'EOL') AND `supplier_id` = 1 AND `updated` < '2014-11-29 07:15:01'

这会使用null-safe equality运算符,因此它会匹配flag = NULL

的行

如果您无法使用此运算符,则可以使用:

SELECT * FROM `app_supplier_products` WHERE (`flag` IS NULL OR FLAG != 'EOL') AND `supplier_id` = 1 AND `updated` < '2014-11-29 07:15:01'