Неожиданное поведение MS SQL Server
Я думал, что достаточно хорошо понимаю SQL, но вот простой пример значений NULL, представляющих ошибку, которую я не ожидал. Может ли кто-нибудь объяснить, почему первый и второй запросы SELECT дают разные результаты.
DROP TABLE IF EXISTS #temp;
CREATE TABLE #temp
(
ITEM int,
RELATIONSHIP nvarchar(max) NULL
)
INSERT INTO #temp VALUES (1, '')
INSERT INTO #temp VALUES (2, NULL)
INSERT INTO #temp VALUES (3, 'Parent')
INSERT INTO #temp VALUES (4, 'Child')
SELECT
ITEM, RELATIONSHIP,
CAST(CASE
WHEN (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child')
THEN 0
ELSE 1
END AS bit) family
FROM
#temp;
SELECT
ITEM, RELATIONSHIP,
CAST(CASE
WHEN (RELATIONSHIP = 'Parent' OR RELATIONSHIP = 'Child')
THEN 1
ELSE 0
END AS bit) family
FROM
#temp;
SELECT
ITEM, RELATIONSHIP,
CAST(CASE
WHEN (RELATIONSHIP IS NULL OR (RELATIONSHIP != 'Parent' AND RELATIONSHIP != 'Child'))
THEN 0
ELSE 1
END AS bit) family
FROM
#temp;
ITEM RELATIONSHIP family
1 0
2 NULL 1
3 Parent 1
4 Child 1
ITEM RELATIONSHIP family
1 0
2 NULL 0
3 Parent 1
4 Child 1
ITEM RELATIONSHIP family
1 0
2 NULL 0
3 Parent 1
4 Child 1
Это потому, что все скалярные сравнения значений NULL всегда ложны, а (ложь И ложь) всегда ложны?