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
相关产品推荐
相关产品推荐

