2016-08-17 178 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