Запросы Sargable с использованием ISNULL в TSQL - PullRequest
6 голосов
/ 17 февраля 2011

Я пытаюсь предотвратить невыражаемые выражения в моих запросах. Какой лучший способ проверить наличие нулевого условия?

AND c.Account IS NOT NULL 
AND c.Account <> ''

или

AND ISNULL(c.Account,'') <> ''

До меня дошло, что Account исходит от LEFT JOIN, поэтому оно может быть нулевым.Мне нужны случаи, когда они только пересекаются, а это значит, что я должен просто использовать INNER JOIN да?Спасибо за лицевые маски;)

Однако, не обращая внимания на тошнотворную самореализацию, я все еще хочу знать ответ на этот вопрос в общем случае, когда я не могу сделать Account столбцом NOT NULL.

Ответы [ 3 ]

2 голосов
/ 12 сентября 2015

Просто используйте WHERE c.Account <> ''

Это не имеет значения true для null или для пустой строки и потенциально может быть оценено с использованием поиска диапазона по Account.

Использоватьлибо ISNULL, либо COALESCE сделали бы выражение неразрешимым и в любом случае не нужным.

Если вы хотите отличить действительно пустые строки от строк, состоящих исключительно из пробелов, вы можете использовать

 WHERE c.Account IS NOT NULL AND DATALENGTH(c.Account) > 0

, который объединяет один предикат sargable, который позволяет поиску индекса пропускать нулевые значения в индексе с ненаряжаемым значением против оставшихся значений.

2 голосов
/ 17 февраля 2011

C.Account <> '' эквивалентно ISNULL( c.Account, '' ) <> ''

SQL Server, вероятно, достаточно умен, чтобы преобразовать IsNull в эквивалентное выражение SARG, но если вы склонны использовать функцию, то Coalesce - лучший выбор, потому чтоявляется частью стандарта SQL, допускает множественные значения (вместо двух с IsNull) и избегает использования, возможно, самого запутанного имени функции, когда-либо созданного Microsoft в IsNull.

0 голосов
/ 10 сентября 2015

COALESCE ЗАПИСИВАЕТСЯ, так как это всего лишь сокращенное выражение (эквивалент использования CASE WHEN IS NOT NULL THEN ELSE ...).

ISNULL является встроенной функцией, поэтому ISNULL НЕ ЗАПРАВЛЯЕТСЯ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...