逻辑运算符¶
逻辑运算符返回针对一个或两个输入表达式的特定布尔运算的结果。逻辑运算符也称为布尔运算符。
逻辑运算符只能用作谓词(例如,在 WHERE 子句中)。输入表达式必须是谓词。
逻辑运算符列表¶
运算符 |
语法示例 |
描述 |
---|---|---|
|
|
同时匹配两个表达式( |
|
|
与表达式不匹配。 |
|
|
匹配任一表达式。 |
这些运算符的优先顺序如下所示(从高到低):
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;
+----+----+------+
| 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';
+----+----+------+
| ID | A | B |
|----+----+------|
| 2 | 25 | Down |
+----+----+------+
SELECT *
FROM logical_test1
WHERE a > 20 OR
b = 'Down';
+----+----+------+
| ID | A | B |
|----+----+------|
| 2 | 25 | Down |
| 3 | 15 | Down |
| 4 | 47 | Up |
+----+----+------+
SELECT *
FROM logical_test1
WHERE a > 20 OR
b = 'Up';
+----+----+------+
| ID | A | B |
|----+----+------|
| 1 | 8 | Up |
| 2 | 25 | Down |
| 4 | 47 | Up |
+----+----+------+
SELECT *
FROM logical_test1
WHERE NOT a > 20;
+----+----+------+
| ID | A | B |
|----+----+------|
| 1 | 8 | Up |
| 3 | 15 | Down |
+----+----+------+
显示逻辑运算符的优先级¶
以下示例显示了逻辑运算符的优先级。
第一个示例表明 AND 的优先级高于 OR 的优先级。查询返回匹配这些条件的行:
b
等于Down
。
OR
a
等于8
ANDb
等于Up
。
SELECT *
FROM logical_test1
WHERE b = 'Down' OR
a = 8 AND b = 'Up';
+----+----+------+
| ID | A | B |
|----+----+------|
| 1 | 8 | Up |
| 2 | 25 | Down |
| 3 | 15 | Down |
+----+----+------+
您可以使用 WHERE 子句中的括号来更改优先级。例如,以下查询返回匹配这些条件的行:
b
等于Down
ORa
等于8
。
AND
b
等于Up
。
SELECT *
FROM logical_test1
WHERE (b = 'Down' OR a = 8) AND b = 'Up';
+----+---+----+
| ID | A | B |
|----+---+----|
| 1 | 8 | Up |
+----+---+----+
下一个示例表明 NOT 的优先级高于 AND 的优先级。例如,以下查询返回匹配这些条件的行:
a
NOT 等于15
。
AND
b
等于Down
。
SELECT *
FROM logical_test1
WHERE NOT a = 15 AND b = 'Down';
+----+----+------+
| ID | A | B |
|----+----+------|
| 2 | 25 | Down |
+----+----+------+
您可以使用 WHERE 子句中的括号来更改优先级。例如,以下查询返回的行 NOT 匹配这两个条件:
a
等于15
。
AND
b
等于Down
。
SELECT *
FROM logical_test1
WHERE NOT (a = 15 AND b = 'Down');
+----+----+------+
| 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;
+-------+------+
| A | B |
|-------+------|
| False | True |
+-------+------+
以下查询使用 OR 运算符返回 a
或 b
为 TRUE 的行:
SELECT a, b FROM logical_test2 WHERE a OR b;
+-------+------+
| A | B |
|-------+------|
| False | True |
+-------+------+
以下查询使用 AND 运算符返回 a
和 b
都是 TRUE 的行:
SELECT a, b FROM logical_test2 WHERE a AND b;
+---+---+
| A | B |
|---+---|
+---+---+
以下查询使用 AND 运算符和 NOT 运算符返回 b
为 TRUE、a
为 FALSE 的行:
SELECT a, b FROM logical_test2 WHERE b AND NOT a;
+-------+------+
| A | B |
|-------+------|
| False | True |
+-------+------+
以下查询使用 AND 运算符和 NOT 运算符返回 a
为 TRUE、b
为 FALSE 的行:
SELECT a, b FROM logical_test2 WHERE a AND NOT b;
+---+---+
| A | B |
|---+---|
+---+---+
显示逻辑运算符的“真值表”¶
接下来的几个示例显示了布尔列中逻辑运算符的“真值表”。有关 Snowflake 中布尔值行为的详细信息,请参阅 三元逻辑。
创建新表和数据:
CREATE OR REPLACE TABLE logical_test3 (x BOOLEAN);
INSERT INTO logical_test3 (x) VALUES
(False),
(True),
(NULL);
此示例显示了 OR 运算符的真值表:
SELECT x AS "OR",
x OR False AS "FALSE",
x OR True AS "TRUE",
x OR NULL AS "NULL"
FROM logical_test3;
+-------+-------+------+------+
| 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;
+-------+-------+-------+-------+
| AND | FALSE | TRUE | NULL |
|-------+-------+-------+-------|
| False | False | False | False |
| True | False | True | NULL |
| NULL | False | NULL | NULL |
+-------+-------+-------+-------+