Select 在 Postgres 上不同(不区分大小写)

Select Distinct (case insensitive) on Postgres

这已经被问到 here 和其他几个地方之前,但似乎建议的答案不适用于 postgres 或者在这种情况下不起作用。

我正在寻找 select 不同的列名称,例如:

SELECT DISTINCT column_name FROM table_name WHERE ... ORDER BY column_name 但是我希望消除区分大小写的重复项(例如 Aa 应该被认为是同一件事)

我试过 COLLATE 但所有可用的格式都区分大小写。通过 LOWER()UPPER() 更改大小写将不起作用,因为在这种情况下我需要案例信息。

我想过这样的事情来获取唯一值,但仍然保持这种情况:

SELECT DISTINCT upper(my_column) as upper_case, my_column
FROM my_table
ORDER BY upper(my_column)

但是在不同的查询中引入 my_column 否定了整个事情。

如何在不修改结果本身大小写的情况下获得唯一值(不区分大小写)?

在 PostgreSQL(但不是很多其他数据库)中,您可以使用 DISTINCT ON 子句:

SELECT DISTINCT ON (upper(my_column)) my_column
FROM my_table
ORDER BY upper(my_column)

您甚至可以选择要获得的结果,方法是在 ORDER BY 子句中添加另一列以使所需结果首先出现:

SELECT DISTINCT ON (upper(my_column)) my_column
FROM my_table
ORDER BY upper(my_column), other_column

文档:DISTINCT Clause

您可以使用聚合函数:

SELECT MAX(my_column)
FROM my_table
GROUP BY upper(my_column);

这returns一个值。如果你想要所有的值:

SELECT ARRAY_AGG(DISTINCT my_column)
FROM my_table
GROUP BY upper(my_column);