SQLのor演算子についてまとめています。
SQLのorの構文
whereの条件文をorで接続します。以下の場合は、first_name(姓名の名)がGeorgiまたは、Maryのデータを抽出する例です。
mysql> select emp_no, first_name, last_name from employees where first_name='Georgi' or first_name='Mary'; +--------+------------+-------------+ | emp_no | first_name | last_name | +--------+------------+-------------+ | 10001 | Georgi | Facello | | 10011 | Mary | Sluis | | 10532 | Mary | Wossner | | 10909 | Georgi | Atchley | | 11029 | Georgi | Itzfeldt | | 11430 | Georgi | Klassen | | 11821 | Mary | Piazza | | 12157 | Georgi | Barinka | | 12334 | Mary | Ertl | | 13562 | Mary | Cooley | : :
【関連記事】
▶SQLのor演算子は条件を論理和で接続 inや行コンストラクタで置換が可能
andとorが条件式に混在していた場合、or条件はand条件よりも優先順位が低いです。or条件を優先したい場合は、カッコでor条件を括ります。
mysql> select emp_no, first_name, last_name from employees where first_name='Georgi' and ( last_name = 'Facello' or last_name='Klassen' ); +--------+------------+-----------+ | emp_no | first_name | last_name | +--------+------------+-----------+ | 10001 | Georgi | Facello | | 11430 | Georgi | Klassen | | 55649 | Georgi | Facello | +--------+------------+-----------+ 3 rows in set (0.09 sec)
Oracleのorの構文
Oracleのorの構文は以下の通り。記述方法には特にOracleの独自拡張等はありません。
SELECT employee_id FROM employees WHERE commission_pct = .4 OR salary > 20000 ORDER BY employee_id;
OR条件を指定するとOracleのオプティマイザは、内部的にUNION ALLに変換します。
SELECT * FROM sales WHERE promo_id=33 OR prod_id=136;
上記のSQLを実行すると、オプティマイザは以下のUNION ALLを使った2つのSQLを実行します。
SELECT * FROM sales WHERE prod_id=136 UNION ALL SELECT * FROM sales WHERE promo_id=33 AND LNNVL(prod_id=136);
SQL Serverのorの構文
SQL Serverのor演算子には、特に独自拡張等はありません。
-- Uses AdventureWorks SELECT FirstName, LastName, BaseRate, HireDate FROM DimEmployee WHERE BaseRate < 10 OR HireDate >= '2001-01-01';
関連)OR (Transact-SQL) – SQL Server | Microsoft Docs
SQL ServerのビットごとのOR論理和演算は、|(パイプ)を使用します。
SELECT a_int_value | b_int_value FROM bitwise; GO ----------- 235 (1 row(s) affected)
関連)| (ビット演算子 OR) (Transact-SQL) | Microsoft Docs – SQL Server | Microsoft Docs
MySQLのorの構文
MySQLでは、orの代わりに||(パイプ2つ)を使ってor条件の記述が可能です。
mysql> select emp_no, first_name, last_name from employees where first_name='Georgi' || first_name='Mary' limit 10; +--------+------------+-----------+ | emp_no | first_name | last_name | +--------+------------+-----------+ | 10001 | Georgi | Facello | | 10011 | Mary | Sluis | | 10532 | Mary | Wossner | | 10909 | Georgi | Atchley | | 11029 | Georgi | Itzfeldt | | 11430 | Georgi | Klassen | | 11821 | Mary | Piazza | | 12157 | Georgi | Barinka | | 12334 | Mary | Ertl | | 13562 | Mary | Cooley | +--------+------------+-----------+ 10 rows in set, 1 warning (0.05 sec)
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.3.3 論理演算子
PostgreSQLのorの構文
PostgreSQLでは、特にor演算子の拡張はありません。
SELECT * from tbl WHERE x > 0 OR y/x > 1.5;
関連)PostgreSQL公式リファレンスマニュアル:論理演算子
PostgreSQLで、CREATE OR REPLACE FUNCTON…と記述する場合のORは、論理演算子ではなく、CREATE FUNCTIONの文法の一部です。
ストアドファンクションが存在しなければ新規作成し、存在していれば置き換えを行います。
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$ BEGIN RETURN i + 1; END; $$ LANGUAGE plpgsql;
関連)PostgreSQL公式リファレンスマニュアル:CREATE FUNCTION
まとめ
- SQLのor演算子は、複数の条件式を「または」で接続できる
- 条件式でor条件をand条件より優先させるには括弧を使う
- MySQLなど一部のDBMSでは、orの代わりに||を代替できるものもある