V SQL, OR
operátor vám umožňuje používat alternativní podmínky při filtrování vašich dotazů.
OR
operátor kombinuje dvě podmínky a vrací TRUE
když je některá z podmínek TRUE
.
Tabulka zdrojů
Následující tabulka je použita pro příklady na této stránce.
SELECT * FROM Pets;
Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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)
Příklad
Zde je jednoduchý příklad pro demonstraci OR
operátor.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Vidíme, že skutečně vrátila řádky s PetName
sloupec byl buď Fluffy
nebo Tweet
. Nebyly vráceny žádné další řádky.
Různé sloupce
V předchozím příkladu obě podmínky porovnávaly hodnoty se stejným sloupcem, ale není to podmínkou. Výrazy na obou stranách OR
operátor může použít různé sloupce k porovnání hodnot. OR
operátor jednoduše vrátí TRUE
když je některá z těchto podmínek TRUE
.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
V kombinaci s jinými operátory
Vaše kritéria filtrování mohou kombinovat výrazy, které kromě OR
používají další operátory operátor.
Zde je příklad, který obsahuje AND
operátor.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Výsledek:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Všimněte si, že jsem obklopil OR
podmínka se závorkami. Důvod, proč jsem to udělal, byl, že ve výchozím nastavení OR
operátory se vyhodnocují po AND
operátory. SQL má definované pořadí priority operátorů ve výrazu a to určuje, že AND
operátor je vyhodnocen před OR
operátor.
Můžete však použít závorky k přepsání definované priority operátorů ve výrazu. Vše v závorkách je vyhodnoceno tak, aby vrátilo jedinou hodnotu. Tuto hodnotu může použít jakýkoli operátor mimo tyto závorky.
Jinými slovy, pomocí závorek můžete určit pořadí, ve kterém chcete, aby byly jednotlivé logické operátory ve výrazu vyhodnoceny.
Proč je to problém?
Podívejte se na výsledky, když odstraníme závorky.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Ve skutečnosti dostáváme jiný výsledek.
Důvodem je, že dotaz nyní kontroluje PetName = 'Tweet' AND DOB >= '2020-11-20'
nejprve a poté zkontroluje OR
výraz PetName = 'Fluffy'
.
Je to, jako bychom kolem AND
umístili závorky výraz, jako je tento:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Abychom však věci ještě více zmátli, mohli bychom změnit uspořádání našeho dotazu tak, abychom nepoužívali závorky, a přesto jsme získali stejný výsledek jako náš první příklad se závorkami.
Takhle:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Výsledek:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
V tomto případě AND
výraz byl podle očekávání vyhodnocen jako první. Pořadí výrazů se právě seřadilo tak, že DOB >= '2020-11-20' AND PetName = 'Fluffy'
byl hodnocen jako první, takže jsme vyloučili druhého mazlíčka jménem Fluffy kvůli jeho DOB
spadající mimo tento rozsah. Teprve poté byl OR
výraz vyhodnocen jako alternativní podmínka k našemu stávajícímu AND
výsledek.
Morálka tohoto příběhu? Při použití více operátorů použijte závorky. Tímto způsobem můžete určit přesné pořadí, ve kterém chcete, aby byl každý výraz vyhodnocen.