2016-08-17 183 views
0

所以我用下面where語句查詢。基本上,我想確保在過去7天內沒有運動或球員活動。在where語句中處理NULL值(SQL)

WHERE...... 
AND (((SELECT max(sportswagerbyleague.asOfDate) 
      FROM sportswagerbyleague 
      WHERE sportswagerbyleague.userID = customer_profile.userID) 
       <= date(CURDATE()) - INTERVAL 7 DAY ) 
       AND ((SELECT max(pa.txndate) 
        FROM player_activity pa 
        WHERE pa.userID = customer_profile.userID) <= date(CURDATE()) - INTERVAL 7 DAY)) 

但是,如果有一個NULL值(也就是該用戶要麼沒有玩家活動或體育活動),那麼WHERE語句成爲該特定用戶錯誤。即使對於單個NULL值,我也希望WHERE語句保持爲真。

對此提出建議?

回答

0

將值與NULL值進行比較始終爲false,因此您必須分別處理該情況。你可以使用類似IS NULL這樣的目的。

0

切換到NOT EXISTS來避免三值邏輯:

WHERE...... 
AND NOT EXISTS 
(SELECT * 
    FROM sportswagerbyleague 
    WHERE sportswagerbyleague.userID = customer_profile.userID 
    AND sportswagerbyleague.asOfDate > date(CURDATE()) - INTERVAL 7 DAY 
) 
AND NOT EXISTS 
(
    SELECT *max(pa.txndate) 
    FROM player_activity pa 
    WHERE pa.userID = customer_profile.userID 
    AND pa.txndate > date(CURDATE()) - INTERVAL 7 DAY 
) 
+0

任何理由爲什麼它是「*」,而不是「最大(sportswagerbyleague.asOfDate)」或者是它只是一個錯字? – eddd83

+0

沒有類型,像max(sportswagerbyleague.asOfDate)這樣的聚集總是會返回一行(如果沒有匹配的行,則返回「NULL」),所以'NOT EXISTS'永遠不會是真的。 '[NOT] EXISTS'是實際推薦'*'的唯一地方:-) – dnoeth