Странное поведение MySQL для сравнения

Я нашел вопрос это может объяснить, что я получаю в результате. Но все же это кажется странным поведением.

У нас есть таблица, заполненная продуктами поставщиков, которая обновляется каждый день (новые данные читаются из 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. В будущем мы могли бы добавить другие возможные значения. Это означает, что нам нужно будет обновить все запросы, когда мы добавим другое значение.

Почему первый запрос не возвращает ожидаемые строки?

0

Решение

Измените запрос на:

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

Это использует нулевое безопасное равенство оператор, поэтому он будет соответствовать строк, где 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'
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]