Вообще говоря, с точки зрения пользователя вы не хотите, чтобы булевское выражение оценивалось в NULL.
Написание SQL обычно включает в себя запись запросов в , явно избегая Значения NULL в булевых выражениях. IMX, разработчики будут рассматривать использование трехзначной логики намеренно считаться злоупотреблением трехзначной логикой. Правильно написанный запрос должен обрабатывать NULL и понимать их. Вы не пишете их таким образом, чтобы они работали правильно, когда что-то было NULL. Обычно это включает COALESCE()
или IS NULL
или IS NOT NULL
где-то.
Однако важно, чтобы вы поняли логику, потому что NULL существуют и неизбежны для большинства реальных данных.
Например, допустим, что я работаю над таблицей учеников. В таблице указаны поля First, Middle и Last name. Я хочу знать список студентов, у которых нет среднего имени. Теперь некоторые приложения будут хранить пустую строку ''
, а некоторые приложения будут хранить значение NULL, а некоторые приложения могут выполнять и (и некоторые RDBMS, такие как Oracle, обрабатывают пустые строки как NULL). Если вы не были уверены, вы могли бы написать:
SELECT *
FROM Student
WHERE MiddleName = ''
OR MiddleName IS NULL;
Другой общий сценарий, когда вы OUTER присоединения к другой таблице. Допустим, вы сравниваете зарплату учителей. У вас есть таблица для проверок и таблица для CheckDetail. Вы хотите знать, сколько учителей платят за пособия. Ваш отчет должен перечислить всех учителей, даже если они подрядчиков, которые не платят за выгоды, потому что они не получают какой-либо:
SELECT Check.Employee_Id,
SUM(CheckDetail.Amount) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
ON Check.Id = CheckDetail.CheckId
AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;
Вы запускаете отчет, и вы заметите, что ваши учителя подрядные показать NULL for BenefitsDeductions. К сожалению.Вы должны убедиться, что это отображается как ноль:
SELECT Check.Employee_Id,
COALESCE(SUM(CheckDetail.Amount),0) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
ON Check.Id = CheckDetail.CheckId
AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;
Итак, вы пытаетесь это сделать, и оно работает. Нет значений NULL! Но ... через несколько дней ваши пользователи сообщают, что преподаватели, которых раньше были подрядчиками, показываются с 0, даже если они платят за пособия сейчас. Вы должны COALESCE перед SUM, чтобы эти суммы:
SELECT Check.Employee_Id,
SUM(COALESCE(CheckDetail.Amount,0)) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
ON Check.Id = CheckDetail.CheckId
AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;
Обнаружение этих видов случаев угловых и исключений, что написание SQL все о.
В этой статье есть одна ссылка, показывающая истину и неизвестность, оценивающие неизвестность. (эти ячейки http://i.stack.imgur.com/Yd7zq.png) –
Ложно, а что-то ложно. Нет необходимости рассматривать последующие условия. Правда или что-то в этом роде. (NB: связанная статья имеет ошибку в таблицах истинности для false, как указано в комментариях Hugo Kornelis) –
'IF 1 = 2 AND NULL = 1 PRINT 'TRUE' ELSE PRINT 'FALSE'' –