FIND_IN_SET 函数
FIND_IN_SET 函数,可直接用于查询逗号分隔字符串中元素的位置,具体如下:
语法:
FIND_IN_SET(str, strlist)
str:待查找的字符串。
strlist:以逗号分隔的字符串列表。
返回值:
返回 str 在 strlist 中的位置(从 1 开始计数),若未找到则返回 0。
示例:
--1.查找元素位置
SELECT
FIND_IN_SET('b', 'a,b,c,d') AS pos1, -- 返回 2
FIND_IN_SET('d', 'apple,banana,date') AS pos2; -- 返回 0(未找到)
--2.在 WHERE 子句中过滤数据
--假设 tags 字段值为 'new,urgent,hot',则匹配该记录。
SELECT order_id, tags
FROM orders
WHERE FIND_IN_SET('urgent', tags) > 0;
--3.与 CASE 语句结合分类
SELECT
user_id,
CASE
WHEN FIND_IN_SET('admin', roles) > 0 THEN '高级用户'
WHEN FIND_IN_SET('editor', roles) > 0 THEN '中级用户'
ELSE '普通用户'
END AS permission_level
FROM user_roles;
array_contains函数
array_contains 是用于检查数组中是否包含特定元素的函数。以下是全面解析:
语法:
array_contains(array<T>, value) → boolean
输入:
array<T>:目标数组(支持基本类型、结构体、嵌套数组)
value:待检查的元素(类型需与数组元素一致)
输出:
true:数组包含该元素
false:数组不包含该元素
NULL:任一输入为 NULL(Hive 行为)或元素类型不匹配
示例:
--1.查找元素
SELECT array_contains(split('A,B,C', ','), 'B'); --true
--2.在 WHERE 子句中过滤数据
--假设 interests 字段值为 ['reading', 'hiking', 'music'],则命中该记录。
SELECT user_id, interests
FROM user_profiles
WHERE array_contains(interests, 'hiking');
--3.与 CASE 语句结合分类
SELECT
user_id,
CASE
WHEN array_contains(privileges, 'admin') THEN '管理员'
WHEN array_contains(privileges, 'editor') THEN '编辑'
ELSE '普通用户'
END AS role
FROM users;