論理演算子

論理演算子は、1つまたは2つの入力式で特定のブール演算の結果を返します。論理演算子はブール演算子とも呼ばれます。

論理演算子は述語としてのみ使用できます(例: WHERE 句内)。入力式は述語でなければなりません。

こちらもご参照ください。

BOOLANDBOOLNOTBOOLORBOOLXOR

論理演算子のリスト

演算子

構文例

説明

AND

a AND b

両方の表現(a および b)に一致します。

NOT

NOT a

式と一致しません。

OR

a OR b

いずれかの式に一致します。

これらの演算子の優先順位を以下に示します(最高から最低まで)。

  • NOT

  • AND

  • OR

以下の例では論理演算子を使用します。

テーブルデータに対するクエリで論理演算子を使用する

テーブルを作成してデータを挿入します。

CREATE OR REPLACE TABLE logical_test1 (id INT, a INT, b VARCHAR);

INSERT INTO logical_test1 (id, a, b) VALUES (1, 8, 'Up');
INSERT INTO logical_test1 (id, a, b) VALUES (2, 25, 'Down');
INSERT INTO logical_test1 (id, a, b) VALUES (3, 15, 'Down');
INSERT INTO logical_test1 (id, a, b) VALUES (4, 47, 'Up');

SELECT * FROM logical_test1;
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  1 |  8 | Up   |
|  2 | 25 | Down |
|  3 | 15 | Down |
|  4 | 47 | Up   |
+----+----+------+

単一の論理演算子を使用するクエリを実行する

さまざまなクエリの WHERE 句で単一の論理演算子を使用します。

SELECT *
  FROM logical_test1
  WHERE a > 20 AND
        b = 'Down';
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  2 | 25 | Down |
+----+----+------+
SELECT *
  FROM logical_test1
  WHERE a > 20 OR
        b = 'Down';
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  2 | 25 | Down |
|  3 | 15 | Down |
|  4 | 47 | Up   |
+----+----+------+
SELECT *
  FROM logical_test1
  WHERE a > 20 OR
        b = 'Up';
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  1 |  8 | Up   |
|  2 | 25 | Down |
|  4 | 47 | Up   |
+----+----+------+
SELECT *
  FROM logical_test1
  WHERE NOT a > 20;
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  1 |  8 | Up   |
|  3 | 15 | Down |
+----+----+------+

論理演算子の優先順位を表示する

次の例は、論理演算子の優先順位を示しています。

最初の例は、 AND の優先順位が OR の優先順位よりも高いことを示しています。クエリは、これらの条件に一致する行を返します。

  • bDown と等しい。

OR

  • a8 と等しく、かつ(AND) bUp と等しい。

SELECT *
  FROM logical_test1
  WHERE b = 'Down' OR
        a = 8 AND b = 'Up';
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  1 |  8 | Up   |
|  2 | 25 | Down |
|  3 | 15 | Down |
+----+----+------+

WHERE 句で括弧を使用すると、優先順位を変更できます。たとえば、以下のクエリはこれらの条件に一致する行を返します。

  • bDown と等しい、または(OR) a8 と等しい。

AND

  • bUp と等しい。

SELECT *
  FROM logical_test1
  WHERE (b = 'Down' OR a = 8) AND b = 'Up';
Copy
+----+---+----+
| ID | A | B  |
|----+---+----|
|  1 | 8 | Up |
+----+---+----+

次の例は、 NOT の優先順位が AND の優先順位よりも高いことを示しています。たとえば、以下のクエリはこれらの条件に一致する行を返します。

  • a15 と等しくない(NOT)。

AND

  • bDown と等しい。

SELECT *
  FROM logical_test1
  WHERE NOT a = 15 AND b = 'Down';
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  2 | 25 | Down |
+----+----+------+

WHERE 句で括弧を使用すると、優先順位を変更できます。たとえば、以下のクエリは、これらの条件の両方に一致しない(NOT)行を返します。

  • a15 と等しい。

AND

  • bDown と等しい。

SELECT *
  FROM logical_test1
  WHERE NOT (a = 15 AND b = 'Down');
Copy
+----+----+------+
| ID |  A | B    |
|----+----+------|
|  1 |  8 | Up   |
|  2 | 25 | Down |
|  4 | 47 | Up   |
+----+----+------+

ブール値のクエリで論理演算子を使用する

テーブルを作成してデータを挿入します。

CREATE OR REPLACE TABLE logical_test2 (a BOOLEAN, b BOOLEAN);

INSERT INTO logical_test2 VALUES (0, 1);

SELECT * FROM logical_test2;
Copy
+-------+------+
| A     | B    |
|-------+------|
| False | True |
+-------+------+

以下のクエリは、 OR 演算子を使用して、 a または b のいずれかが TRUE である行を返します。

SELECT a, b FROM logical_test2 WHERE a OR b;
Copy
+-------+------+
| A     | B    |
|-------+------|
| False | True |
+-------+------+

以下のクエリは、 AND 演算子を使用して、 ab の両方が TRUE である行を返します。

SELECT a, b FROM logical_test2 WHERE a AND b;
Copy
+---+---+
| A | B |
|---+---|
+---+---+

以下のクエリは、 AND 演算子と NOT 演算子を使用して、 b が TRUE であり、 a が FALSE である行を返します。

SELECT a, b FROM logical_test2 WHERE b AND NOT a;
Copy
+-------+------+
| A     | B    |
|-------+------|
| False | True |
+-------+------+

以下のクエリは、 AND 演算子と NOT 演算子を使用して、 a が TRUE であり、 b が FALSE である行を返します。

SELECT a, b FROM logical_test2 WHERE a AND NOT b;
Copy
+---+---+
| A | B |
|---+---|
+---+---+

論理演算子の「真理値テーブル」を表示する

次のいくつかの例は、ブール列の論理演算子の「真理値テーブル」を示しています。Snowflakeにおけるブール値の動作については、 三項論理 をご参照ください。

新しいテーブルとデータを作成します。

CREATE OR REPLACE TABLE logical_test3 (x BOOLEAN);

INSERT INTO logical_test3 (x) VALUES
  (False),
  (True),
  (NULL);
Copy

これは、 OR 演算子の真理値テーブルを示しています。

SELECT x AS "OR",
       x OR False AS "FALSE",
       x OR True AS "TRUE",
       x OR NULL AS "NULL"
  FROM logical_test3;
Copy
+-------+-------+------+------+
| OR    | FALSE | TRUE | NULL |
|-------+-------+------+------|
| False | False | True | NULL |
| True  | True  | True | True |
| NULL  | NULL  | True | NULL |
+-------+-------+------+------+

これは、 AND 演算子の真理値テーブルを示しています。

SELECT x AS "AND",
       x AND False AS "FALSE",
       x AND True AS "TRUE",
       x AND NULL AS "NULL"
  FROM logical_test3;
Copy
+-------+-------+-------+-------+
| AND   | FALSE | TRUE  | NULL  |
|-------+-------+-------+-------|
| False | False | False | False |
| True  | False | True  | NULL  |
| NULL  | False | NULL  | NULL  |
+-------+-------+-------+-------+