I SQL er OR
operatør giver dig mulighed for at bruge alternative betingelser, når du filtrerer dine forespørgsler.
OR
operator kombinerer to betingelser og returnerer TRUE
når en af betingelserne er TRUE
.
Kildetabel
Følgende tabel bruges til eksemplerne på denne side.
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)
Eksempel
Her er et simpelt eksempel til at demonstrere 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, at den faktisk returnerede rækkerne med PetName
kolonne var enten Fluffy
eller Tweet
. Ingen andre rækker blev returneret.
Forskellige kolonner
I det foregående eksempel sammenlignede begge betingelser værdier med den samme kolonne, men dette er ikke et krav. Udtrykkene på hver side af OR
operatør kan bruge forskellige kolonner til at sammenligne værdier med. OR
operatør vil blot returnere TRUE
når en af disse betingelser er 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 | +---------+-------------+-----------+-----------+------------+
Kombineret med andre operatører
Dine filtreringskriterier kan kombinere udtryk, der bruger andre operatorer ud over OR
operatør.
Her er et eksempel, der inkluderer 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 | +---------+-------------+-----------+-----------+------------+
Bemærk, at jeg omgav OR
tilstand med parentes. Grunden til at jeg gjorde det var fordi, som standard, OR
operatører evalueres efter AND
operatører. SQL har en defineret rækkefølge af operatørerne i et udtryk, og dette dikterer, at AND
operatoren evalueres før OR
operatør.
Du kan dog bruge parenteser til at tilsidesætte den definerede forrang for operatorerne i et udtryk. Alt inden for parentes evalueres for at returnere en enkelt værdi. Denne værdi kan bruges af enhver operatør uden for disse parenteser.
Med andre ord kan du bruge parenteser til at angive den rækkefølge, som du ønsker, at hver logisk operator skal evalueres i et udtryk.
Hvorfor er dette et problem?
Tag et kig på resultaterne, når vi fjerner parenteserne.
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 faktisk et andet resultat.
Dette skyldes, at forespørgslen nu tjekker PetName = 'Tweet' AND DOB >= '2020-11-20'
først og derefter tjekker OR
udtryk PetName = 'Fluffy'
.
Det er, som om vi ville sætte parenteser omkring AND
udtryk som dette:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Men for at forvirre tingene endnu mere, kunne vi omarrangere vores forespørgsel, så vi ikke bruger parenteser, og alligevel får det samme resultat som vores første eksempel med parenteser.
Sådan:
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 dette tilfælde er AND
udtryk blev evalueret først, som forventet. Rækkefølgen af udtrykkene kom lige på linje, så DOB >= '2020-11-20' AND PetName = 'Fluffy'
blev evalueret først, så vi udelukkede det andet kæledyr kaldet Fluffy på grund af dets DOB
falder uden for dette område. Først efter det var OR
udtryk evalueret som en alternativ betingelse til vores eksisterende AND
resultat.
Moralen i denne historie? Brug parenteser, når du bruger flere operatorer. På den måde kan du angive den nøjagtige rækkefølge, som du ønsker, at hvert udtryk skal evalueres i.