2014-12-29 2 views
0

내가 결과로 얻고있는 것을 설명 할 수있는 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 될 수 있습니다. 앞으로는 가능한 다른 값을 추가 할 것입니다. 즉, 다른 값을 추가 할 때 모든 쿼리를 업데이트해야합니다.

첫 번째 쿼리가 예상되는 행을 반환하지 않는 이유는 무엇입니까?

+0

합니까'(! 플래그 = 'EOL'NULL 또는 플래그 IS)'일? – Barmar

+0

또는 'NOT (플래그 <=>'EOL ')'은 어떨까요? null 안전 등호 연산자에 대해서는 http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to를 참조하십시오. – Barmar

+0

'(플래그 IS NULL 또는 플래그! = 'EOL')'실제로 예상대로 작동합니다. 하지만 NULL은 '설정되지 않음', 'emtpy'로 보인다고 생각했는데 ... 왜 우리는 명시 적으로 검사를해야합니까? (이제 내 인생은 '적은 것을 적어 라, 더 할 것'이었습니다 :) – Brainfeeder

답변

1

변경 쿼리에 : 그것은 어디 flag = NULL 행을 일치 있도록

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

이것은 null-safe equality 연산자를 사용합니다. 이 연산자를 사용할 수없는 경우

, 당신은 사용할 수 있습니다

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

이것은 내 선호하는 솔루션이어야합니다. 그러나 우리는 이러한 종류의 비교를 지원하지 않는이 CodeIgniter ORM 라이브러리를 사용하고 있습니다. – Brainfeeder

+0

두 번째 것을 사용했습니다. 도와 주셔서 감사합니다. 그리고 모든 열에서 NULL을 기본값으로 사용하기로 결정한 사람은 누구든 ... – Brainfeeder