Hive SQL:如何判断列值是否存在于另一列逗号分隔列表中
筛选november_product不在december_product逗号列表中的记录
原始表(表A)
| id | november_product | december_product |
|---|---|---|
| 123 | A | A,C,D |
| 123 | B | A,C,D |
| 456 | C | E,F,G |
需求说明
筛选出november_product的值不存在于同条记录december_product逗号分隔列表中的记录,期望结果如下:
期望结果表
| id | november_product | december_product |
|---|---|---|
| 123 | B | A,C,D |
| 456 | C | E,F,G |
可行解决方法
根据不同数据库环境,提供以下几种方案:
1. MySQL 环境
使用FIND_IN_SET()函数直接检查值是否在逗号列表中,返回0表示不存在:
SELECT id, november_product, december_product FROM A WHERE FIND_IN_SET(november_product, december_product) = 0;
2. PostgreSQL 环境
将逗号字符串转为数组,再用<> ALL()判断值不在数组内:
SELECT id, november_product, december_product FROM A WHERE november_product <> ALL(string_to_array(december_product, ','));
3. SQL Server 环境
用STRING_SPLIT()拆分字符串,结合NOT EXISTS子查询筛选:
SELECT id, november_product, december_product FROM A WHERE NOT EXISTS ( SELECT 1 FROM STRING_SPLIT(A.december_product, ',') AS sp WHERE sp.value = A.november_product );
4. 通用兼容写法(适配多数数据库)
通过拼接前后逗号避免部分匹配错误(比如防止"AB"被误判为在"A,ABC"中):
SELECT id, november_product, december_product FROM A WHERE CONCAT(',', december_product, ',') NOT LIKE CONCAT('%,', november_product, ',%');
内容的提问来源于stack exchange,提问作者Kiet
相关产品推荐
相关产品推荐

