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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:30:00