Предикат SQL Server Exists - PullRequest
       7

Предикат SQL Server Exists

0 голосов
/ 05 августа 2011

Я понимаю, что это

IF EXISTS(SELECT NULL) PRINT 'TRUE';

всегда будет печатать TRUE, потому что в конце концов NULL является значением в SQL Server, но зачем это

IF EXISTS(SELECT NULL) PRINT 'TRUE'

print TRUE поскольку подзапрос вызовет ошибку, а EXISTS всегда проверяет существование, почему это возможно.

1 Ответ

5 голосов
/ 05 августа 2011

Догадка, потому что в вашем вопросе есть ошибка копирования / вставки

EXISTS не проверяет значения. Проверяет строки.

Так что они действительны, потому что SELECT дает одну строку

IF EXISTS(SELECT 1/0) PRINT 'TRUE' 
IF EXISTS(SELECT NULL) PRINT 'TRUE';
IF EXISTS(SELECT CAST('fish' AS int)) PRINT 'TRUE';

Для объяснения мы рассмотрим ANSI-92 SQL , ищем "Query expressions 191".

Это случай 3а (жирный):

Если <select list> "*" просто содержится в <subquery> который сразу же содержится в <exists predicate>, то <select list> эквивалентен <value expression>, который является произвольным <literal>.

Итак, это говорит о том, что вы можете иметь любой старый мусор в бите EXISTS: его следует игнорировать

...