AnalyticDB for PostgreSQL は、PostgreSQL と同一の論理演算子をサポートしています。AND、OR、および NOT を使用して、SQL クエリ内の複雑なフィルター条件を構築します。
PostgreSQL の完全な仕様については、「論理演算子」をご参照ください。
演算子
| 演算子 | 構文 | 説明 |
|---|---|---|
AND | a AND b | 両方のオペランドが TRUE の場合に TRUE を返します |
OR | a OR b | 少なくとも一方のオペランドが TRUE の場合に TRUE を返します |
NOT | NOT a | オペランドのブール値を反転します |
演算子の優先順位(高い順):
NOTANDOR
単一の条件内で複数の演算子を組み合わせる場合、デフォルトの優先順位を上書きするには、括弧を使用します。
NULL の動作
NULL を含む論理演算は、必ずしも NULL を返すわけではありません。たとえば、NULL AND FALSE は FALSE と評価され、NULL OR TRUE は TRUE と評価されます。
完全な真理値表を以下に示します。
AND および OR の真理値表
| a | b | a AND b | a OR b |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE | TRUE |
| TRUE | NULL | NULL | TRUE |
| FALSE | FALSE | FALSE | FALSE |
| FALSE | NULL | FALSE | NULL |
| NULL | NULL | NULL | NULL |
NOT
| a | NOT a |
|---|---|
| TRUE | FALSE |
| FALSE | TRUE |
| NULL | NULL |
例
以下の例では、サンプルテーブルを使用して、各演算子による行のフィルタリング方法を示します。
CREATE TABLE orders (id INT, amount INT, status VARCHAR);
INSERT INTO orders VALUES
(1, 8, 'shipped'),
(2, 25, 'pending'),
(3, 15, 'pending'),
(4, 47, 'shipped');AND — 両方の条件が真である必要があります
SELECT * FROM orders WHERE amount > 20 AND status = 'pending';結果:
id | amount | status
----+--------+---------
2 | 25 | pendingOR — いずれかの条件が真であれば構いません
SELECT * FROM orders WHERE amount > 20 OR status = 'pending';結果:
id | amount | status
----+--------+---------
2 | 25 | pending
3 | 15 | pending
4 | 47 | shipped優先順位 — AND は OR よりも優先度が高い
次のクエリは、status = 'pending' である行、または amount = 8 かつ status = 'shipped' である行を返します。AND は最初に評価されます。
SELECT * FROM orders WHERE status = 'pending' OR amount = 8 AND status = 'shipped';結果:
id | amount | status
----+--------+---------
1 | 8 | shipped
2 | 25 | pending
3 | 15 | pendingOR を最初に評価するには、括弧を追加します:
SELECT * FROM orders WHERE (status = 'pending' OR amount = 8) AND status = 'shipped';結果:
id | amount | status
----+--------+---------
1 | 8 | shippedNOT — 条件を否定します
SELECT * FROM orders WHERE NOT status = 'shipped';結果:
id | amount | status
----+--------+---------
2 | 25 | pending
3 | 15 | pending