0

我有一个查询来获取当天正在运行的一组测验。我想确保用户尚未完成该测验。我的查询是:

SELECT qi.qiId, qi.qiTitle, qi.qiDescription, qi.qiDate, qi.qiLeague, qi.qiType, qi.qiNumQuestions 
FROM quizzes qi 
LEFT JOIN quizOneDaySpecials qo 
ON qo.qoQuizId = qi.qiId 
AND qo.qoUserId = 11 
WHERE qi.qiLeague = 0 
AND qo.qoIsCompleted != 1 
AND qi.qiDate BETWEEN 1381878000 AND 1381964399

所有测验的详细信息都在quizzes表中,如果用户已经开始或完成了测验,那么记录中将存在quizOneDaySpecials. 但是,如果用户尚未开始测验,则不会出现任何记录quizOneDaySpecials,这就是我的问题发生的地方。

qo.qoIsCompletedNULL如果用户还没有开始测验,并且每次我运行我的查询我都没有得到任何结果。如果我取出,AND qo.qoIsCompleted != 1则用户尚未开始的测验将按预期返回。

为什么我在办理登机手续时没有退回我的测验qo.qoIscompleted != 1?它似乎完全有效,它不等于 1,因为它是NULL.

4

3 回答 3

1

您不能直接比较 NULL 值和非 null 值。在默认设置下,SQL Server 不知道 NULL 是否等于 1。它只知道它是 NULL。看起来你想要的是类似的东西

WHERE IFNULL(qo.qoIsCompleted, 0) != 1  AND ...
于 2013-10-16T17:01:08.323 回答
1

如果我正确理解您的问题,则检查NULL与检查值不同。您OUTER JOIN通过将其包含在您的WHERE标准中来否定您的。将该检查移至 ,JOIN然后检查IS NULL您的WHERE条件。

SELECT qi.qiId, qi.qiTitle, qi.qiDescription, qi.qiDate, qi.qiLeague, qi.qiType, qi.qiNumQuestions 
FROM quizzes qi 
    LEFT JOIN quizOneDaySpecials qo 
        ON qo.qoQuizId = qi.qiId 
            AND qo.qoUserId = 11 
            AND qo.qoIsCompleted = 1 
WHERE qi.qiLeague = 0 
    AND qi.qiDate BETWEEN 1381878000 AND 1381964399
    AND qo.qoQuizId IS NULL
于 2013-10-16T17:02:44.460 回答
1

Null 评估为未知,因此不会匹配除 IS NULL 或 IS NOT NULL 之外的任何运算符。您可以在 qoIsCompleted 中添加 OR 语句,也可以使用 IFNULL() 函数来检查它是否为空,以及它是否默认为 0 之类的值,以使其不匹配。

AND IFNULL(qo.qoIsCompleted, 0) != 1
于 2013-10-16T17:01:47.387 回答