Неожиданное поведение 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 всегда ложны, а (ложь И ложь) всегда ложны?

0 ответов

Другие вопросы по тегам