En SQL, le OR
vous permet d'utiliser des conditions alternatives lors du filtrage de vos requêtes.
Le OR
l'opérateur combine deux conditions et renvoie TRUE
lorsque l'une des conditions est TRUE
.
Tableau des sources
Le tableau suivant est utilisé pour les exemples sur cette page.
SELECT * FROM Pets;
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Exemple
Voici un exemple simple pour démontrer le OR
opérateur.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Nous pouvons voir qu'il a bien renvoyé les lignes où le PetName
la colonne était soit Fluffy
ou Tweet
. Aucune autre ligne n'a été renvoyée.
Différentes colonnes
Dans l'exemple précédent, les deux conditions comparaient des valeurs à la même colonne, mais ce n'est pas obligatoire. Les expressions de part et d'autre du OR
L'opérateur peut utiliser différentes colonnes pour comparer les valeurs. Le OR
l'opérateur renverra simplement TRUE
lorsque l'une de ces conditions est TRUE
.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Combiné avec d'autres opérateurs
Vos critères de filtrage peuvent combiner des expressions qui utilisent d'autres opérateurs en plus du OR
opérateur.
Voici un exemple qui inclut le AND
opérateur.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Remarquez que j'ai entouré le OR
condition entre parenthèses. La raison pour laquelle je l'ai fait est que, par défaut, OR
les opérateurs sont évalués après AND
les opérateurs. SQL a un ordre de priorité défini des opérateurs dans une expression, et cela dicte que le AND
l'opérateur est évalué avant le OR
opérateur.
Cependant, vous pouvez utiliser des parenthèses pour remplacer la priorité définie des opérateurs dans une expression. Tout ce qui se trouve entre parenthèses est évalué pour renvoyer une valeur unique. Cette valeur peut être utilisée par n'importe quel opérateur en dehors de ces parenthèses.
En d'autres termes, vous pouvez utiliser des parenthèses pour spécifier l'ordre dans lequel vous souhaitez que chaque opérateur logique soit évalué dans une expression.
Pourquoi est-ce un problème ?
Jetez un œil aux résultats lorsque nous supprimons les parenthèses.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Nous obtenons en fait un résultat différent.
En effet, la requête vérifie maintenant PetName = 'Tweet' AND DOB >= '2020-11-20'
d'abord, puis vérifie le OR
expression PetName = 'Fluffy'
.
C'est comme si on mettait des parenthèses autour du AND
expression, comme ceci :
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Cependant, pour confondre encore plus les choses, nous pourrions réorganiser notre requête afin de ne pas utiliser de parenthèses, tout en obtenant toujours le même résultat que notre premier exemple avec des parenthèses.
Comme ceci :
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Dans ce cas, le AND
l'expression a été évaluée en premier, comme prévu. L'ordre des expressions s'est simplement aligné de sorte que DOB >= '2020-11-20' AND PetName = 'Fluffy'
a été évalué en premier, nous avons donc exclu l'autre animal appelé Fluffy en raison de sa DOB
tombant en dehors de cette plage. Ce n'est qu'après cela que le OR
expression évaluée comme une condition alternative à notre AND
existant résultat.
La morale de cette histoire? Utilisez des parenthèses lorsque vous utilisez plusieurs opérateurs. De cette façon, vous pouvez spécifier l'ordre exact dans lequel vous souhaitez que chaque expression soit évaluée.