php - 用于比较的奇怪 MySQL 行为

标签 php mysql null

我找到了question这也许可以解释我得到的结果。但这似乎仍然是一个奇怪的行为。

我们有一个充满供应商产品的表,它每天都会更新(从 xml 读取新数据)。在此过程中,“已更新”列会获取新的日期时间值。从供应商 xml 文件中消失的产品应在“标志”列中标记为 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。将来我们可能会添加其他可能的值。这意味着当我们添加另一个值时,我们必须更新所有查询。

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

最佳答案

将查询更改为:

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'

关于php - 用于比较的奇怪 MySQL 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690592/

相关文章:

ios - fatal error : Unexpectedly found nil while unwrapping an Optional value NSURL

php - 准备语句是否保护您的数据库?

php - Laravel 过滤已经过滤的结果

php - 无法正确回显数组

mysql - 当我的所有搜索条件都可以为空时,如何在 MySQL 中找到最新的匹配记录?

python - return,return None,根本不返回?

php - MySQL 和 PHP - 计算数据库中产品的价格

PHP通过href传递变量id

mysql - 使用两个分区是否仍然比没有它们更好?

c# - Asp.NET 返回空 List<Object> C#