【问题标题】:Select Distinct (case insensitive) on Postgres在 Postgres 上选择 Distinct(不区分大小写)
【发布时间】:2021-10-19 20:31:48
【问题描述】:

here 和其他一些地方之前已经问过这个问题,但似乎建议的答案要么不适用于 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)

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

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

【问题讨论】:

  • SELECT DISTINCT ON (upper(my_column)) my_column 这样的东西有用吗? (已编辑以修复语法)
  • 顺便说一句,你看过the accepted answer on the question you linked吗?对于这个数据库来说,这实际上是这个问题,它返回的正是你所要求的?如果这不是您想要的,您可能需要澄清您的问题......
  • 你是对的。这可以解决问题。我误读了那里的答案。我以为只是DISTINCT 而不是DISTINCT ON
  • 不用担心;很容易错过:-)

标签: sql postgresql postgresql-11


【解决方案1】:

您可以使用聚合函数:

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);

【讨论】:

    【解决方案2】:

    在 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

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2011-05-16
      • 1970-01-01
      • 2015-07-05
      • 2017-05-04
      相关资源
      最近更新 更多