내가 결과로 얻고있는 것을 설명 할 수있는 question을 발견했습니다. 그러나 여전히 이상한 행동입니다.비교를위한 이상한 MySQL 동작
우리는 공급 업체 제품으로 가득 찬 테이블을 가지고 있으며 매일 업데이트됩니다 (XML에서 읽은 새로운 데이터). 'updated'열은 프로세스 중에 새로운 datetime 값을 가져옵니다. 공급 업체 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 또는 EOL 될 수 있습니다. 앞으로는 가능한 다른 값을 추가 할 것입니다. 즉, 다른 값을 추가 할 때 모든 쿼리를 업데이트해야합니다.
첫 번째 쿼리가 예상되는 행을 반환하지 않는 이유는 무엇입니까?
합니까'(! 플래그 = 'EOL'NULL 또는 플래그 IS)'일? – Barmar
또는 'NOT (플래그 <=>'EOL ')'은 어떨까요? null 안전 등호 연산자에 대해서는 http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to를 참조하십시오. – Barmar
'(플래그 IS NULL 또는 플래그! = 'EOL')'실제로 예상대로 작동합니다. 하지만 NULL은 '설정되지 않음', 'emtpy'로 보인다고 생각했는데 ... 왜 우리는 명시 적으로 검사를해야합니까? (이제 내 인생은 '적은 것을 적어 라, 더 할 것'이었습니다 :) – Brainfeeder