Hive SQL:检查列值是否存在于另一列逗号分隔列表并筛选不存在项
筛选不在逗号分隔列表中的记录
原表A结构与数据
| id | november_product | december_product |
|---|---|---|
| 123 | A | A,C,D |
| 123 | B | A,C,D |
| 456 | C | E,F,G |
说明:december_product列存储的是逗号分隔的字符串列表。
需求
检查每条记录中november_product的值是否存在于同一条记录的december_product列表里,筛选出不存在的记录。
期望结果
| id | november_product | december_product |
|---|---|---|
| 123 | B | A,C,D |
| 456 | C | E,F,G |
解决方案
根据不同SQL数据库的特性,使用对应的字符串处理逻辑实现筛选:
1. MySQL/MariaDB
使用FIND_IN_SET函数直接判断字符串是否在逗号分隔列表中,返回0则表示不存在:
SELECT id, november_product, december_product FROM tableA WHERE FIND_IN_SET(november_product, december_product) = 0;
2. PostgreSQL
将逗号分隔字符串转为数组,再判断目标值是否不在数组内:
SELECT id, november_product, december_product FROM tableA WHERE november_product <> ALL(string_to_array(december_product, ','));
或者用数组包含逻辑的取反:
SELECT id, november_product, december_product FROM tableA WHERE NOT (string_to_array(december_product, ',') @> ARRAY[november_product]);
3. SQL Server
通过STRING_SPLIT拆分列表,结合子查询判断是否不存在匹配项:
SELECT id, november_product, december_product FROM tableA t WHERE NOT EXISTS ( SELECT 1 FROM STRING_SPLIT(t.december_product, ',') s WHERE s.value = t.november_product );
也可以用CHARINDEX处理边界避免部分匹配:
SELECT id, november_product, december_product FROM tableA WHERE CHARINDEX(',' + november_product + ',', ',' + december_product + ',') = 0;
4. Oracle
使用正则匹配判断目标值是否不在列表的分隔边界内:
SELECT id, november_product, december_product FROM tableA WHERE NOT REGEXP_LIKE(december_product, '(^|,)' || november_product || '(,|$)');
内容的提问来源于stack exchange,提问作者Kiet
相关产品推荐
相关产品推荐

