我发现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。将来我们可能会添加其他可能的值。这意味着我们在添加其他值时必须更新所有查询。
为什么第一个查询不返回预期的行?
答案 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'