Filtrer les données avec des prédicats

Effectué

Les instructions SELECT les plus simples avec les clauses SELECT et FROM évaluent chaque ligne d’une table. Avec une clause WHERE, vous définissez des conditions qui déterminent les lignes qui seront traitées et réduisent potentiellement le jeu de résultats.

Structure de la clause WHERE

La clause WHERE est constituée d’une ou plusieurs conditions de recherche, chacune d’elles devant avoir la valeur TRUE, FALSE ou « unknown » pour chaque ligne de la table. Des lignes ne seront retournées que lorsque la clause WHERE est évaluée comme TRUE. Les conditions individuelles agissent comme des filtres sur les données et sont appelées « prédicats ». Chaque prédicat comprend une condition qui est testée, généralement à l’aide des opérateurs de comparaison de base :

  • = (est égal à)
  • <> (différent de)
  • > (supérieur à)
  • >= (supérieur ou égal à)
  • < (inférieur à)
  • <= (inférieur ou égal à)

Par exemple, la requête suivante retourne tous les produits dont la valeur ProductCategoryID est 2 :

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

De même, la requête suivante retourne tous les produits dont le ListPrice est inférieur à 10.00 :

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

IS NULL / IS NOT NULL

Vous pouvez également facilement filtrer pour autoriser ou exclure les valeurs « unknown » ou NULL à l’aide IS NULL ou IS NOT NULL.

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

Plusieurs conditions

Plusieurs prédicats peuvent être combinés avec les opérateurs AND et OR, et avec des parenthèses. Toutefois, SQL Server ne traite que deux conditions à la fois. Toutes les conditions doivent être TRUE lors de la connexion de plusieurs conditions avec l’opérateur AND. Lors de l’utilisation de l’opérateur OR pour connecter deux conditions, une ou les deux peuvent être TRUE pour le jeu de résultats.

Par exemple, la requête suivante retourne les produits dans la catégorie 2 dont le coût est inférieur à 10.00 :

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

Les opérateurs AND sont traités avant les opérateurs OR, sauf si des parenthèses sont utilisées. Pour une meilleure pratique, utilisez des parenthèses lors de l’utilisation de plus de deux prédicats. La requête suivante retourne des produits dans la catégorie 2 OR 3 AND coûte moins de 10,00 :

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

Opérateurs de comparaison

Transact-SQL inclut des opérateurs de comparaison qui peuvent vous aider à simplifier la clause WHERE.

IN

L’opérateur IN est un raccourci pour plusieurs conditions d’égalité pour la même colonne connectée avec OR. Il n’y a rien de mal à utiliser plusieurs conditions OR dans une requête, comme dans l’exemple suivant :

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

Toutefois, l’utilisation de IN est claire et concise, et les performances de la requête ne seront pas affectées.

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

BETWEEN

BETWEEN est un autre raccourci qui peut être utilisé lors du filtrage d’une limite supérieure et inférieure pour la valeur au lieu d’utiliser deux conditions avec l’opérateur AND. Les deux requêtes suivantes sont équivalentes :

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;

L’opérateur BETWEEN utilise des valeurs limites inclusives. Les produits dont le prix est d’exactement 1.00 ou 10.00 sont inclus dans les résultats. BETWEEN est également utile lors de l’interrogation de champs de date. Par exemple, la requête suivante inclut tous les noms de produits modifiés entre le 1er janvier 2012 et le 31 décembre 2012 :

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

ProductName

DateModification

Chaussettes Mountain Bike, M

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

Toutefois, étant donné que nous ne spécifions pas d’intervalle de temps, aucun résultat n’est retourné après 2012-12-31 00:00:00.000. Pour inclure précisément la date et l’heure, nous devons inclure l’heure dans le prédicat :

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';

Les opérateurs de comparaison de base tels que Supérieur à (>) et Égal à (=) sont également précis lors du filtrage par date uniquement :

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

LIKE

L’opérateur de comparaison final ne peut être utilisé que pour les données de caractères et nous permet d’utiliser des caractères génériques et des modèles d’expressions régulières. Les caractères génériques nous permettent de spécifier des chaînes partielles. Par exemple, vous pouvez utiliser la requête suivante pour retourner tous les produits dont le nom contient le mot « mountain » :

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

Le caractère générique % représente une chaîne de 0 ou tout nombre de caractères. Par conséquent, les résultats incluent les produits avec le mot « mountain » n’importe où dans leur nom, comme suit :

Nom

ListPrice

Chaussettes Mountain Bike, M

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

Vous pouvez utiliser le caractère générique _ (soulignement) pour représenter un caractère unique, comme suit :

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

Les résultats suivants incluent uniquement les produits qui commencent par « Mountain Bike Socks », et un seul caractère après :

ProductName

ListPrice

Chaussettes Mountain Bike, M

9,50

Mountain Bike Socks, L

9,50

Vous pouvez également définir des modèles complexes pour les chaînes que vous souhaitez rechercher. Par exemple, la requête suivante a recherché des produits portant un nom commençant par « Mountain- », puis suivi de :

  • trois caractères compris entre 0 et 9
  • espace
  • toute chaîne
  • une virgule
  • espace
  • deux caractères compris entre 0 et 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Les résultats de cette requête peuvent se présenter comme suit :

ProductName

ListPrice

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 Silver, 38

2319.99

Mountain-200 Silver, 42

2319.99

Mountain-200 Black, 38

2319.99

Mountain-200 Black, 42

2319.99