I SQL, OR
operatorn låter dig använda alternativa villkor när du filtrerar dina frågor.
OR
operatorn kombinerar två villkor och returnerar TRUE
när något av villkoren är TRUE
.
Källtabell
Följande tabell används för exemplen på den här sidan.
SELECT * FROM Pets;
Resultat:
+---------+-------------+-----------+-----------+------------+ | 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)
Exempel
Här är ett enkelt exempel för att demonstrera OR
operatör.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vi kan se att det verkligen returnerade raderna där PetName
kolumnen var antingen Fluffy
eller Tweet
. Inga andra rader returnerades.
Olika kolumner
I det föregående exemplet jämförde båda villkoren värden mot samma kolumn, men detta är inte ett krav. Uttrycken på vardera sidan av OR
operatör kan använda olika kolumner för att jämföra värden mot. OR
operatören returnerar helt enkelt TRUE
när något av dessa villkor är TRUE
.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Kombinerat med andra operatörer
Dina filtreringskriterier kan kombinera uttryck som använder andra operatorer utöver OR
operatör.
Här är ett exempel som inkluderar AND
operatör.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Lägg märke till att jag omgav OR
skick med parentes. Anledningen till att jag gjorde det var för att, som standard, OR
operatorer utvärderas efter AND
operatörer. SQL har en definierad prioritetsordning för operatorerna i ett uttryck, och detta dikterar att AND
operatorn utvärderas före OR
operatör.
Du kan dock använda parenteser för att åsidosätta den definierade prioriteringen av operatorerna i ett uttryck. Allt inom parentes utvärderas för att returnera ett enda värde. Det värdet kan användas av alla operatorer utanför dessa parenteser.
Med andra ord kan du använda parenteser för att ange i vilken ordning du vill att varje logisk operator ska utvärderas i ett uttryck.
Varför är detta ett problem?
Ta en titt på resultatet när vi tar bort parenteserna.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Resultat:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vi får faktiskt ett annat resultat.
Detta beror på att frågan nu kontrollerar PetName = 'Tweet' AND DOB >= '2020-11-20'
först, kontrollerar sedan OR
uttryck PetName = 'Fluffy'
.
Det är som om vi skulle sätta parenteser runt AND
uttryck, så här:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Men för att förvirra saker ännu mer kan vi ordna om vår fråga så att vi inte använder parenteser och ändå får samma resultat som vårt första exempel med parenteser.
Så här:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Resultat:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
I det här fallet, AND
uttrycket utvärderades först, som förväntat. Ordningen på uttrycken råkade just hamna så att DOB >= '2020-11-20' AND PetName = 'Fluffy'
utvärderades först, så vi uteslöt det andra husdjuret som heter Fluffy på grund av dess DOB
faller utanför det intervallet. Först efter det var OR
uttryck som utvärderas som ett alternativt villkor till vår befintliga AND
resultat.
Moralen i denna berättelse? Använd parenteser när du använder flera operatorer. På så sätt kan du ange den exakta ordningen i vilken du vill att varje uttryck ska utvärderas.