SQL Server: оператор WHERE. WHERE и псевдонимы столбцов. Часть II
Содержание:
1. WHERE для фильтрации, ON для сопоставления;
2. Аргументы поиска и равенство против отличия. Часть I;
3. Аргументы поиска и равенство против отличия. Часть II (Вы читаете данный раздел);
4. Аргументы поиска и равенство против отличия. Часть III;
5. Укороченная операция;
6. WHERE и псевдонимы столбцов.
Как можно заметить, план сканирует охватывающий индекс, вместо того чтобы применить поиск, хотя выбранные строки отображаются в последовательном диапазоне индекса. Чтобы устранить эту проблему, используйте предикат LIKE вместо левой функции, например:
На этот раз мы имеем запрос с аргументом поиска, как можно видеть в плане запроса, показанном на рисунке выше.
Предположим, нам нужно подготовить запрос в хранимой процедуре или определяемую пользователем функцию, которая фильтрует только клиентов из региона, предоставляемого в качестве входного. В программном коде листинга выше используется локальная переменная, имитирующая параметр процедуры. Это запрос с аргументом поиска, он возвращает корректные результаты, пока входные данные отличаются от NULL, как N’WA’ в данном примере. Для некоторых клиентов регион неприменим, и потому имеет значение NULL, которое представляет собой маркер SQL для отсутствующего значения, будь оно применимым или неприменимым (как в нашем случае). SQL использует логику предиката с тремя значениями. Это означает, что при любом сравнении, в котором задействовано значение NULL, в одном или обоих операндах, результатом будет не логическое значение true или false, а логическое значение unknown. Это происходит в сравнениях на основе как равенства, так и неравенства. Посмотрите, каким будет результат, если от приведенного выше запроса требуется принимать входные данные со значением NULL, чтобы возвратить всех клиентов с регионом NULL. Вы получите пустой набор, так как сравнение двух значений NULL с использованием оператора равенства приносит неизвестное значение, а фильтр запроса возвращает только строки, для которых предикат фильтра приносит значение true. Строки, для которых предикат дает значение false или unknown, отбрасываются. В том виде, в котором он существует, запрос содержит ошибку. Обычный способ устранения такой ошибки — использовать функцию ISNULL или COALESCE в обоих операндах сравнения, чтобы заменить NULL значением, обычно не встречающимся в данных, например, как в листинге ниже (назовем этот запрос Query 4).
К сожалению, поскольку мы применяем манипуляции к фильтрованному столбцу, запрос не имеет аргумента поиска, как видно в плане на рисунке выше.
Один из способов наделить запрос аргументом поиска — проверить особый случай, когда оба операнда сравнения имеют значение NULL, с использованием оператора IS NULL вместо оператора равенства, например, как в листинге выше (назовем этот запрос Query 5).
1. WHERE для фильтрации, ON для сопоставления;
2. Аргументы поиска и равенство против отличия. Часть I;
3.
4. Аргументы поиска и равенство против отличия. Часть III;
5. Укороченная операция;
6. WHERE и псевдонимы столбцов.
Как можно заметить, план сканирует охватывающий индекс, вместо того чтобы применить поиск, хотя выбранные строки отображаются в последовательном диапазоне индекса. Чтобы устранить эту проблему, используйте предикат LIKE вместо левой функции, например:
SELECT custid, country, region FROM Sales.Customers
WHERE region LIKE N'W%';На этот раз мы имеем запрос с аргументом поиска, как можно видеть в плане запроса, показанном на рисунке выше.
Предположим, нам нужно подготовить запрос в хранимой процедуре или определяемую пользователем функцию, которая фильтрует только клиентов из региона, предоставляемого в качестве входного. В программном коде листинга выше используется локальная переменная, имитирующая параметр процедуры. Это запрос с аргументом поиска, он возвращает корректные результаты, пока входные данные отличаются от NULL, как N’WA’ в данном примере. Для некоторых клиентов регион неприменим, и потому имеет значение NULL, которое представляет собой маркер SQL для отсутствующего значения, будь оно применимым или неприменимым (как в нашем случае). SQL использует логику предиката с тремя значениями. Это означает, что при любом сравнении, в котором задействовано значение NULL, в одном или обоих операндах, результатом будет не логическое значение true или false, а логическое значение unknown. Это происходит в сравнениях на основе как равенства, так и неравенства. Посмотрите, каким будет результат, если от приведенного выше запроса требуется принимать входные данные со значением NULL, чтобы возвратить всех клиентов с регионом NULL. Вы получите пустой набор, так как сравнение двух значений NULL с использованием оператора равенства приносит неизвестное значение, а фильтр запроса возвращает только строки, для которых предикат фильтра приносит значение true. Строки, для которых предикат дает значение false или unknown, отбрасываются. В том виде, в котором он существует, запрос содержит ошибку. Обычный способ устранения такой ошибки — использовать функцию ISNULL или COALESCE в обоих операндах сравнения, чтобы заменить NULL значением, обычно не встречающимся в данных, например, как в листинге ниже (назовем этот запрос Query 4).
К сожалению, поскольку мы применяем манипуляции к фильтрованному столбцу, запрос не имеет аргумента поиска, как видно в плане на рисунке выше.
Один из способов наделить запрос аргументом поиска — проверить особый случай, когда оба операнда сравнения имеют значение NULL, с использованием оператора IS NULL вместо оператора равенства, например, как в листинге выше (назовем этот запрос Query 5).