我有一个查询来获取当天正在运行的一组测验。我想确保用户尚未完成该测验。我的查询是:
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.qoIsCompleted
为NULL
,每次运行查询时都会返回无效结果。如果我取出AND qo.qoIsCompleted != 1
,则按预期返回用户尚未启动的测验。
为什么在我qo.qoIscompleted != 1
办理登机手续时,我的测验不会被退回?它似乎完全有效,它不等于一个,因为它是NULL
。
答案 0 :(得分:1)
您无法直接比较NULL值和非空值。在默认设置下,SQL Server不知道NULL是否等于1.它只知道它是NULL。它看起来像你想要的是
WHERE IFNULL(qo.qoIsCompleted, 0) != 1 AND ...
答案 1 :(得分:1)
Nulls评估为未知,因此不会匹配IS NULL或IS NOT NULL以外的任何运算符。您可以向qoIsCompleted添加OR语句,也可以使用IFNULL()函数检查它是否为null,如果默认值为0,则表示它不匹配。
AND IFNULL(qo.qoIsCompleted, 0) != 1
答案 2 :(得分: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