Нулевое значение считается существующим значением - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть проверка в условных выражениях, например:

IF(EXISTS
    (SELECT TOP 1 [TaskAssignationId]
     FROM [Task] AS [T]
          INNER JOIN @TaskIdTableType AS [TT] ON [T].[TaskId] = [TT].[Id]
))

Но он возвращает NULL значение, потому что TaskAssignationId равно NULL, следовательно, IF условие верно, потому что оно существует с NULL значение, но я не хочу рассматривать NULL как значение.Как можно добавить исключение нулей?Привет

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Exists работает следующим образом: «Не вернул ли (под) запрос больше, чем ноль (коррелированных) строк?» Не вернул ли (под) запрос ненулевое значение »

Это совершенно верно, существует:

SELECT * FROM person p
WHERE EXISTS (SELECT null FROM address a WHERE a.personid = p.id)

SELECT * FROM person p
WHERE EXISTS (SELECT 1 FROM address a WHERE a.personid = p.id)

SELECT * FROM person p
WHERE EXISTS (SELECT * FROM address a WHERE a.personid = p.id)

Неважно, какие значения вы возвращаете или сколько существует столбцов, заботится о том, равно ли число строк 0 или больше при определении наличия результатов

Следовательно, вы должны убедиться, что ваш (Под) запрос не возвращает строк, если вы хотите, чтобы проверка существующего провала.Если адреса, имеющие тип null , являются неприемлемыми, (под) запрос должен исключить их с WHERE a.type IS NOT NULL, так что рассматриваются только строки с ненулевым типом

Там также мало смыславыполнение ТОП 1 в (под) запросе;Оптимизатор знает, что единственное условие, о котором он заботится, это 0 или не 0 строк, поэтому он автоматически выполняет ТОП 1 (т.е. он прекратит извлекать данные, когда узнает, что есть хотя бы одна строка)

0 голосов
/ 28 сентября 2018

Если вы хотите проверить существование, тогда не нужно присваивать имя столбцу, вы можете использовать select 1

IF (EXISTS SELECT TOP 1 1 FROM [Task] AS [T] INNER JOIN @TaskIdTableType AS[TT] ON [T]. [TaskId] = [TT]. [Id])) начало ---- код --- конец

0 голосов
/ 27 сентября 2018

Если вы не хотите включать строки, в которых [TaskAssignationId] равен нулю, добавьте это в предложение WHERE.

IF(EXISTS
    SELECT TOP 1 [TaskAssignationId]
    FROM [Task] AS [T]
    INNER JOIN @TaskIdTableType AS [TT] ON [T].[TaskId] = [TT].[Id]
    WHERE [TaskAssignationId] is not null  
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...