Postgres中的Select Distinct(忽略大小写)

3

这个问题在这里和其他一些地方都被问到过,但似乎建议的答案要么不适用于Postgres,要么在这种情况下不起作用。

我想选择不同的列名,例如:

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)

但是在distinct查询中引入my_column会破坏整个查询。

如何获取唯一的值(不区分大小写),而不修改结果本身的大小写?


类似 SELECT DISTINCT ON (upper(my_column)) my_column 这样的语句可行吗?(已编辑以修复语法) - Jiří Baum
顺便问一下,你看过你链接的问题的被接受的答案了吗?它就是这个问题,针对这个数据库,返回了你所要求的内容。如果这不是你想要的,请澄清你的问题... - Jiří Baum
你是对的。这样做很有效。我误读了那里的答案。我以为它只是 DISTINCT 而不是 DISTINCT ON - ateymour
没问题,很容易被忽略 :-) - Jiří Baum
2个回答

7
在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子句


3

你可以使用聚合函数:

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

这将返回一个值。如果您想获取所有的值:
SELECT ARRAY_AGG(DISTINCT my_column)
FROM my_table
GROUP BY upper(my_column);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接