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

SQL按条件筛选记录:查询Z列为A、C值的正确实现方法

SQL筛选异常修复方案

原有语句问题

  • 冗余使用distinct:该关键字是对查询返回的所有字段组合做去重,无法实现按SID唯一过滤的需求,只要GID/OID/SID/Z四个字段存在微小差异(比如Z值带不可见空格)就会判定为不同记录,容易返回多余结果。
  • ilike使用不严谨:如果没有显式做精确匹配约束,部分数据库场景下可能出现非预期的近似值匹配,召回不符合Z值要求的记录。

可直接运行的正确写法

针对你给出的测试数据,直接做Z值精确匹配即可得到预期结果,不需要自连接:

SELECT GID, OID, SID, Z
FROM 你的实际表名
WHERE Z IN ('A', 'C')
-- 如果需要不区分大小写匹配,把上面的where条件替换为下面这句即可
-- WHERE LOWER(Z) IN ('a', 'c')

如果你的实际业务数据中存在同一个SID对应多条不同Z值的记录,需要严格保证SID唯一、只保留Z为A/C的记录,可以用窗口函数做分组过滤,兼容性更强:

SELECT GID, OID, SID, Z
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY SID ORDER BY CASE WHEN Z IN ('A','C') THEN 1 ELSE 2 END) AS rn
    FROM 你的实际表名
) t
WHERE rn = 1 AND Z IN ('A','C')

逻辑说明

  • 窗口函数写法会按SID分组,优先将Z值为A/C的记录排在分组最前,每个SID仅返回1条记录,最后再过滤掉Z值不符合要求的条目,完全满足GID/OID可重复、SID不可重复、仅保留Z为A/C记录的需求。
  • 非必要不要使用ilike做精确值匹配,直接用IN做等值判断性能更好,也不会出现模糊匹配带来的结果偏差。

内容的提问来源于stack exchange,提问作者loving_guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:57:26