如何解决SQL查询中无法使用explode函数的问题?
解决SQL中无法直接用explode筛选逗号分隔字符串的问题
你的需求是找出db表中type列(逗号分隔字符串)包含'action'子串的记录,原语句报错是因为explode是行转列函数,不能直接在WHERE子句中用来做等值判断。以下分不同SQL引擎给出可行方案:
MySQL(5.7+)
- 用
FIND_IN_SET函数,专门处理逗号分隔的字符串匹配:
SELECT * FROM db WHERE FIND_IN_SET('action', type) > 0;
- 若要避免部分匹配(比如
'action1'被误判),可以用正则表达式:
SELECT * FROM db WHERE type REGEXP '(^|,)action(,|$)';
PostgreSQL
- 将字符串转为数组后用
ANY操作符匹配:
SELECT * FROM db WHERE 'action' = ANY(string_to_array(type, ','));
- 也可以用
unnest配合关联查询(适合需要处理拆分后其他逻辑的场景):
SELECT DISTINCT db.* FROM db JOIN unnest(string_to_array(db.type, ',')) AS val(val_str) ON val_str = 'action';
Hive/Spark SQL
这类大数据SQL引擎支持LATERAL VIEW配合explode来拆分字符串,再过滤:
SELECT DISTINCT t.* FROM db t LATERAL VIEW explode(split(t.type, ',')) exploded AS val WHERE val = 'action';
加DISTINCT是因为拆分后同一原行会生成多行匹配记录,去重后得到原表的唯一行。
内容的提问来源于stack exchange,提问作者Question1010
相关产品推荐
相关产品推荐

