Фильтровать данные с предикатами.

Завершено

Простейшая инструкция SELECT только с предложениями SELECT и FROM рассчитывает значения в каждой строке в таблице. Предложение WHERE задает условия, определяющие, какие строки будут обрабатываться, и потенциально сокращает результирующий набор.

Структура предложения WHERE

Предложение WHERE содержит одно или несколько условий поиска, результатом каждого из которых должно быть значение TRUE, FALSE или 'unknown' в каждой строке таблицы. Значения строк возвращаются только в том случае, если результатом выполнения предложения WHERE является TRUE. Отдельные условия действуют как фильтры данных и называются предикатами. Каждый предикат включает тестируемое условие (обычно при тестировании используются основные операторы сравнения):

  • = (равно)
  • <> (не равно);
  • > (больше чем);
  • >= (больше или равно);
  • < (меньше чем);
  • <= (меньше или равно).

Например, следующий запрос возвращает все продукты со значением ProductCategoryID равным 2:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;

Аналогичным образом следующий запрос возвращает все продукты со значением ListPrice меньшим 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;

IS NULL / IS NOT NULL

Также можно легко фильтровать значения, чтобы разрешить или исключить значения 'unknown' или NULL с помощью инструкций IS NULL или IS NOT NULL.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;

Множество условий

Несколько предикатов можно использовать совместно с операторами AND и OR, а также с круглыми скобками. Однако SQL Server будет обрабатывать только два условия за раз. Все условия должны иметь значение TRUE при использовании нескольких условий с оператором AND. При использовании оператора OR для включения двух условий одно или оба из них могут иметь значение TRUE для результирующего набора.

Например, следующий запрос возвращает продукт в категории 2, стоимость которого меньше 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    AND ListPrice < 10.00;

Операторы AND обрабатываются до операторов OR, если не используются круглые скобки. Рекомендуется использовать круглые скобки при использовании более двух предикатов. Следующий запрос возвращает продукты в категории 2 OR 3 AND стоимостью менее 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
    AND (ListPrice < 10.00);

Операторы сравнения

В Transact-SQL есть ряд дополнительных операторов сравнения, с помощью которых можно упростить предложение WHERE.

В

Оператор IN является ярлыком для нескольких условий равенства для одного и того же столбца, подключенного с помощью оператора OR. Конечно, можно использовать несколько условий OR в запросе, как показано в следующем примере:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    OR ProductCategoryID = 3
    OR ProductCategoryID = 4;

Однако использование IN является более четким и кратким, и функциональность не меняется.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);

BETWEEN

BETWEEN — это еще один способ оптимизации, который можно использовать при фильтрации по верхней и нижней границам значения вместо использования двух условий с оператором AND. Следующие два запроса эквивалентны.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
    AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;

Оператор BETWEEN использует инклюзивные граничные значения. В результаты будут включены продукты с ценой 1,00 или 10,00. BETWEEN также рекомендуется использовать при запросе полей даты. Например, следующий запрос включает в себя все названия продуктов, измененные в период с 1 января 2012 г. по 31 декабря 2012 г.:

SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';

НаименованиеПродукта

ModifiedDate

Спортивные носки, М

2012-01-01 00:00:00.000

HL Mountain Frame — Silver, 42

2012-03-05 00:00:00.000

HL Mountain Frame — Silver, 38

2012-08-29 00:00:00.000

Mountain-100 Silver, 38

2012-12-31 00:00:00.000

Однако поскольку не указан диапазон времени, результаты не возвращаются после 2012-12-31 00:00:00.000. Для точного указания даты и времени необходимо включить время в предикат:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';

Базовые операторы сравнения, такие как "Больше, чем" (>) и "Равно" (=), также являются точными, если фильтрация выполняется только по дате:

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01' 
    AND ModifiedDate < '2013-01-01';

LIKE

Последний оператор сравнения можно использовать только для символьных данных. Он позволяет использовать подстановочные знаки и шаблоны регулярных выражений. С помощью подстановочных знаков можно указывать частичные строки. Например, можно использовать следующий запрос для возврата всех продуктов с именами, содержащими слово mountain:

SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';

Подстановочный знак % представляет любую строку с 0 или более символов. Поэтому результаты включают продукты со словом mountain в любой части их имени, например:

Имя.

ПрейскурантнаяЦена

Спортивные носки, М

9,50

Mountain Bike Socks, L

9,50

HL Mountain Frame — Silver, 42

1364,0

HL Mountain Frame — Black, 42

1349,60

HL Mountain Frame — Silver, 38

1364,50

Mountain-100 Silver, 38

3399,99

Вы можете использовать подстановочный знак _ (подчеркивание) для представления одного символа следующим образом:

SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';

Следующие результаты содержат только продукты, которые начинаются с "Mountain Bike Socks", с один символом после:

НаименованиеПродукта

ПрейскурантнаяЦена

Спортивные носки, М

9,50

Mountain Bike Socks, L

9,50

Можно определить сложные шаблоны для строк, которые требуется найти. Например, следующий запрос выполняет поиск продуктов с именем, начинающимся с выражения "Mountain-", за которым следуют:

  • три символа от 0 до 9
  • пробел;
  • любая строка
  • запятая
  • пробел;
  • два символа от 0 до 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Результаты этого запроса могут выглядеть примерно так:

НаименованиеПродукта

ПрейскурантнаяЦена

Mountain-100 Silver, 38

3399,99

Mountain-100 Silver, 42

3399,99

Mountain-100 Black, 38

3399,99

Mountain-100 Black, 42

3399,99

Mountain-200, серебристый, 38

2319,99

Mountain-200, серебристый, 42

2319,99

Mountain-200, черный, 38

2319,99

Mountain-200, черный, 42

2319,99