В SQL, OR
операторът ви позволява да използвате алтернативни условия при филтриране на вашите заявки.
OR
оператор комбинира две условия и връща TRUE
когато някое от условията е TRUE
.
Изходна таблица
Следната таблица се използва за примерите на тази страница.
SELECT * FROM Pets;
Резултат:
+---------+-------------+-----------+-----------+------------+ | 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)
Пример
Ето един прост пример за демонстриране на OR
оператор.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet';
Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Можем да видим, че наистина е върнал редовете, където е PetName
колоната беше или Fluffy
или Tweet
. Не бяха върнати други редове.
Различни колони
В предишния пример и двете условия сравняваха стойности с една и съща колона, но това не е изискване. Изразите от двете страни на OR
операторът може да използва различни колони за сравняване на стойности. OR
операторът просто ще върне TRUE
когато някое от тези условия е TRUE
.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR DOB < '2020-01-01';
Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Комбинирано с други оператори
Вашите критерии за филтриране могат да комбинират изрази, които използват други оператори в допълнение към OR
оператор.
Ето пример, който включва AND
оператор.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Забележете, че заобиколих OR
условие със скоби. Причината да го направя беше, че по подразбиране OR
операторите се оценяват след AND
оператори. SQL има дефиниран ред на приоритет на операторите в израз и това диктува, че AND
операторът се оценява преди OR
оператор.
Въпреки това, можете да използвате скоби, за да замените дефинирания приоритет на операторите в израз. Всичко в скоби се оценява, за да върне една стойност. Тази стойност може да се използва от всеки оператор извън тези скоби.
С други думи, можете да използвате скоби, за да посочите реда, в който искате всеки логически оператор да бъде оценен в израз.
Защо това е проблем?
Разгледайте резултатите, когато премахнем скобите.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Резултат:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Всъщност получаваме различен резултат.
Това е така, защото заявката сега проверява PetName = 'Tweet' AND DOB >= '2020-11-20'
първо, след това проверява OR
израз PetName = 'Fluffy'
.
Сякаш бихме поставили скоби около AND
израз, като този:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Въпреки това, за да объркаме нещата още повече, бихме могли да пренаредим заявката си, така че да не използваме скоби и въпреки това да получим същия резултат като първия ни пример със скоби.
Като това:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
В този случай AND
експресията беше оценена първо, както се очакваше. Редът на изразите току-що се подреди така, че DOB >= '2020-11-20' AND PetName = 'Fluffy'
беше оценено първо, така че изключихме другия домашен любимец, наречен Fluffy, поради неговия DOB
попадат извън този диапазон. Едва след това беше OR
израз, оценен като алтернативно условие на нашето съществуващо AND
резултат.
Моралът на тази история? Използвайте скоби, когато използвате няколко оператора. По този начин можете да посочите точния ред, в който искате всеки израз да бъде оценен.