contains:判断字符串包含
速查结论
contains(left, right) 是 Spark SQL 中用于判断字符串是否包含子串的函数。如果 left 包含 right 则返回 true。注意:区分大小写,'Spark' 和 'SPARK' 被视为不同。支持 STRING 和 BINARY 类型。
语法
contains(left, right)
参数说明
| 参数 | 说明 |
|---|---|
left | 被搜索的字符串或二进制表达式 |
right | 要查找的子串或二进制表达式 |
返回值:left 包含 right 时返回 true。任一参数为 NULL 时返回 NULL。
Since: 3.3.0
示例
基础判断
-- 包含匹配(区分大小写)
SELECT contains('Spark SQL', 'Spark');
-- 结果: true
-- 大小写不匹配
SELECT contains('Spark SQL', 'SPARK');
-- 结果: false
-- NULL 传播
SELECT contains('Spark SQL', NULL);
-- 结果: NULL
二进制匹配
-- 二进制数据的包含判断
SELECT contains(x'537061726b2053514c', x'537061726b');
-- 结果: true
contains vs LIKE vs rlike 对比
| 函数 | 匹配方式 | 区分大小写 | 适用场景 |
|---|---|---|---|
contains(str, sub) | 精确子串匹配 | 是 | 判断是否包含固定子串 |
LIKE | 通配符 % _ | 是(取决于 collation) | 简单模式匹配 |
rlike(str, regex) | 正则表达式 | 是 | 复杂正则匹配 |
-- contains: 精确子串
SELECT contains('hello world', 'world');
-- 结果: true
-- LIKE: % 通配符
SELECT 'hello world' LIKE '%world%';
-- 结果: true
-- rlike: 正则
SELECT rlike('hello world', 'w.rld');
-- 结果: true
选型建议:
- 已知明确子串:用
contains,语义最清晰 - 前后可能有任意字符:用
LIKE '%sub%' - 复杂模式(可选字符、数字匹配):用
rlike
常见报错与避坑指南
大小写敏感
contains 区分大小写,大小写不匹配会返回 false。
-- 错误写法:大小写不一致
SELECT contains('Spark SQL', 'spark');
-- 结果: false
-- 正确写法:不区分大小写时用 lower/upper
SELECT contains(lower('Spark SQL'), lower('SPARK'));
-- 结果: true
任一参数为 NULL
任一参数为 NULL 时结果也为 NULL,需要在 WHERE 条件中注意。
-- NULL 导致结果也是 NULL
SELECT contains(NULL, 'abc');
-- 结果: NULL
SELECT contains('abc', NULL);
-- 结果: NULL
-- 用 coalesce 设置默认值
SELECT contains(coalesce(col, ''), 'abc') FROM t;
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
