SQL Server - запрос не показывает строки, в которых значение столбца равно нулю - PullRequest
0 голосов
/ 17 марта 2019

У меня есть такая таблица пользователей -

Просмотр таблицы

Я использую следующий запрос для извлечения строк, в которых идентификатор факультета - CSE001, обозначение не студент, а роль пользователя не является координатором маркетинга -

Просмотр запроса

Но это не дает мне результат, который мне нужен, потому что 2 строки, которые я ожидал получить взамен, имеют ноль в столбце UserRole. Итак, ничего не возвращается.

Результат запроса

Итак, как мне написать запрос, чтобы он возвращал мне строки, даже если они имеют значение NULL в столбце UserRole? Кто-нибудь может мне помочь? Спасибо ...

Ответы [ 3 ]

1 голос
/ 17 марта 2019

В SQL Server значения могут отсутствовать, но могут применяться, например, значение цвета волос, которое не было предоставлено человеку, или может отсутствовать, но не может применяться, например, значение для жирного лица.В любом случае SQL Server помечает пропущенные значения как NULL.A NULL не является ни TRUE, ни FALSE, но UNKNOWN.Это третье значение в трехзначной логике.Другими словами, вы можете определить, является ли X = Y ИСТИНА или ЛОЖЬ, если вы знаете значения как X, так и Y, но что, если X отсутствует?SQL Server вернет UNKNOWN, помеченный как NULL.Это ваш случай: вы знаете, что Y известен (равно «Маркетинговый координатор»), но X может отсутствовать.Поскольку WHERE возвращает только те строки, которые соответствуют условиям (т. Е. Каждый предикат оценивается как TRUE), результаты UNKNOWN будут отфильтрованы.

Вам нужно будет написать запросы, использующие трехзначныелогика для учета трех возможных результатов: TRUE, FALSE и UNKNOWN.В предложениях ON, WHERE и HEAVING SQL Server будет обрабатывать NULL как FALSE.С другой стороны, ORDER BY сортирует NULLs вместе и первым.

Вы можете проверить значения NULL с помощью операторов IS NULL или IS NOT NULL вместо равных.

1 голос
/ 17 марта 2019

Проверьте для обозначения и UserRole, если они содержат значения NULL.Используйте IS NULL или NOT NULL для такого рода проверок.Это потому, что вы не можете сравнить NULL с конкретными значениями.

SELECT * FROM Users
WHERE FacultyId = 'CSE001'
AND (Designation <> 'Student' OR Designation IS NULL)
AND (UserRole <> 'Marketing Coordinator' OR UserRole IS NULL)

Надеюсь, это поможет.

0 голосов
/ 17 марта 2019

Вы явно запросили значения NULL, потому что они довольно специфичны для реляционных баз данных.

Это было бы правильно:

SELECT *
FROM Users
WHERE FacultyId <>'CSE001'
AND Designation <> 'Student'
AND (UserRole <> 'Marketing Coordinator' OR UserRole IS NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...