谓词函数
功能描述
谓词函数用于判断条件是否成立,返回BOOLEAN值。Spark 4.0将常用条件判断函数归类为谓词函数,包括比较运算符、空值判断、模式匹配和逻辑运算等。
函数/操作符列表
| 函数/操作符 | 描述 |
|---|---|
| expr1 = expr2 | 等于。如果expr1等于expr2,返回true。 |
| expr1 == expr2 | 等于(=的别名)。 |
| expr1 != expr2 / expr1 <> expr2 | 不等于。 |
| expr1 < expr2 | 小于。 |
| expr1 <= expr2 | 小于等于。 |
| expr1 > expr2 | 大于。 |
| expr1 >= expr2 | 大于等于。 |
| expr1 <=> expr2 | NULL安全等于。非NULL操作数与=相同,但两个NULL返回true,一个NULL返回false。 |
| equal_null(expr1, expr2) | 与<=>相同。非NULL操作数与=相同,两个NULL返回true。 |
| expr1 AND expr2 | 逻辑与。 |
| expr1 OR expr2 | 逻辑或。 |
| NOT expr / ! expr | 逻辑非。 |
| expr1 IN(expr2, expr3, ...) | 如果expr等于任一值,返回true。 |
| str LIKE pattern [ESCAPE escape] | 模式匹配。_匹配单个字符,%匹配任意字符序列。 |
| str ILIKE pattern [ESCAPE escape] | 不区分大小写的模式匹配。 |
| regexp(str, regexp) | 如果str匹配正则表达式,返回true。 |
| regexp_like(str, regexp) | 如果str匹配正则表达式,返回true。 |
| rlike(str, regexp) | regexp的别名。如果str匹配正则表达式,返回true。 |
| isnan(expr) | 如果值为NaN(Not a Number),返回true。 |
| isnull(expr) | 如果值为NULL,返回true。 |
| isnotnull(expr) | 如果值不为NULL,返回true。 |
| nanvl(expr1, expr2) | 如果expr1为NaN,返回expr2;否则返回expr1。 |
| nullif(expr1, expr2) | 如果expr1等于expr2,返回NULL;否则返回expr1。 |
| nvl(expr1, expr2) | 如果expr1为NULL,返回expr2;否则返回expr1。 |
| nvl2(expr1, expr2, expr3) | 如果expr1不为NULL,返回expr2;否则返回expr3。 |
| coalesce(expr1, expr2, ...) | 返回第一个非NULL值。 |
| assert_true(expr) | 如果expr为true,返回NULL;否则抛出异常。 |
| assert_true(expr, message) | 如果expr为true,返回NULL;否则抛出带指定消息的异常。 |
| raise_error(expr) | 抛出指定错误消息的异常。 |
示例
比较运算符
SELECT 1 < 2; -- true SELECT 2 <= 2; -- true SELECT 2 > 1; -- true SELECT 2 >= 1; -- true SELECT 1 = '1'; -- true SELECT 1 != 2; -- true
NULL安全等于(<=> / equal_null)
SELECT NULL <=> NULL; -- true SELECT NULL = NULL; -- NULL SELECT equal_null(NULL, NULL); -- true SELECT equal_null(3, 3); -- true
逻辑运算
SELECT true AND false; -- false SELECT true OR false; -- true SELECT NOT true; -- false SELECT ! true; -- false
LIKE / ILIKE 模式匹配
SELECT like('Spark', '_park');
-- true
SELECT ilike('Spark', '_Park');
-- true(不区分大小写) 正则表达式匹配
SELECT regexp('%SystemDrive%\\Users\\John', r'%SystemDrive%\\Users.*');
-- true
SELECT regexp_like('%SystemDrive%\\Users\\John', r'%SystemDrive%\\Users.*');
-- true
SELECT rlike('%SystemDrive%\\Users\\John', r'%SystemDrive%\\Users.*');
-- true IN 运算符
SELECT 1 IN(1, 2, 3); -- true SELECT 1 IN(2, 3, 4); -- false
空值判断
SELECT isnan(cast('NaN' AS DOUBLE));
-- true
SELECT isnull(NULL);
-- true
SELECT isnotnull(1);
-- true nullif / nvl / nvl2 / coalesce
SELECT nullif(1, 1); -- NULL SELECT nullif(1, 2); -- 1 SELECT nvl(NULL, 123); -- 123 SELECT nvl2(NULL, 'yes', 'no'); -- no SELECT nvl2(1, 'yes', 'no'); -- yes SELECT coalesce(NULL, NULL, 3, 5); -- 3
nanvl
SELECT nanvl(cast('NaN' AS DOUBLE), 123);
-- 123.0 assert_true / raise_error
SELECT assert_true(1 = 1); -- NULL
注意事项
- 谓词函数在WHERE、HAVING和CASE WHEN等条件表达式中特别有用。
- isnan仅适用于浮点类型(FLOAT、DOUBLE)。
- coalesce接受多个参数,返回第一个非NULL值。所有参数类型必须兼容。
- LIKE区分大小写,ILIKE不区分大小写。
- regexp、regexp_like、rlike功能相同,均为正则表达式匹配。
- assert_true和aise_error可用于数据验证场景。