PostgreSQL如何实现不改变结果原有大小写的不区分大小写去重查询
解决方案
方案1:使用PostgreSQL特有的DISTINCT ON语法(最简单高效)
这是最适配该场景的写法,性能表现优于窗口函数方案:
SELECT DISTINCT ON (LOWER(my_column)) my_column FROM my_table -- 可在此处添加自定义WHERE过滤条件 ORDER BY LOWER(my_column), my_column;
DISTINCT ON (表达式)会按照括号内的表达式结果判断重复,表达式结果相同的仅保留第一条记录ORDER BY子句中必须把DISTINCT ON对应的表达式放在第一位,后续可自定义同一去重组内的返回优先级:如上写法会优先返回字典序更靠前的拼写,如果要保留最新插入的拼写,可把排序条件修改为ORDER BY LOWER(my_column), create_time DESC- 返回的
my_column完全保留原始大小写,不会被修改
方案2:使用窗口函数实现(灵活度更高)
如果需要更复杂的组内筛选逻辑,比如优先保留出现次数最多的拼写,可以用窗口函数实现:
WITH ranked_values AS ( SELECT my_column, ROW_NUMBER() OVER( PARTITION BY LOWER(my_column) -- 自定义组内排序规则,下面的写法优先保留出现次数最多的拼写 ORDER BY COUNT(*) OVER (PARTITION BY LOWER(my_column), my_column) DESC, my_column ) AS rn FROM my_table -- 可在此处添加自定义WHERE过滤条件 ) SELECT my_column FROM ranked_values WHERE rn = 1 ORDER BY LOWER(my_column);
原写法失效原因说明
你之前的写法中DISTINCT作用于所有查询列的组合,只要upper_case和my_column的组合不同就会被判定为独立值,因此大小写不同的记录会同时被返回,去重逻辑自然失效。
内容的提问来源于stack exchange,提问作者ateymour
相关产品推荐
相关产品推荐

