You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hive SQL:检查列值是否存在于另一列逗号分隔列表并筛选不存在项

筛选不在逗号分隔列表中的记录

原表A结构与数据

idnovember_productdecember_product
123AA,C,D
123BA,C,D
456CE,F,G

说明:december_product列存储的是逗号分隔的字符串列表。

需求

检查每条记录中november_product的值是否存在于同一条记录的december_product列表里,筛选出不存在的记录。

期望结果

idnovember_productdecember_product
123BA,C,D
456CE,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:42:40