PostgreSQL:如何将大写/小写视为重复项,而不是更改大小写并保留较早的条目?

Posted

技术标签:

【中文标题】PostgreSQL:如何将大写/小写视为重复项,而不是更改大小写并保留较早的条目?【英文标题】:PostgreSQL: How to treat upper/lower case as duplicates, not change case and keep earlier entry? 【发布时间】:2021-09-09 05:28:31 【问题描述】:

在下文中,'abc' 和 'ABC' 应被视为重复项。但我想保留原来的外壳,我想采用较早日期的条目。所以我最终得到:abc, 2021-06-01

我认为这会起作用,但它没有:

select t.s, max(t.d) from 
(
   select 'abc' s, '2021-06-01'::date d union all
   select 'ABC' s, '2021-06-21'::date d 
) t
group by lower(t.s)

抛出此错误:Invalid operation: column "t.s" must appear in the GROUP BY clause or be used in an aggregate function;

我在这里错过了什么?

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用 PostgreSQL 特定的 DISTINCT ON 构造。

select distinct on (lower(t.s)) t.s, t.d from 
(
   select 'abc' s, '2021-06-01'::date d union all
   select 'ABC' s, '2021-06-21'::date d 
) t
order by lower(t.s), d asc;

如果您想要更标准的 SQL,可以使用窗口函数添加行号,然后过滤该行号:

select * from (
   select *, row_number() over (partition by lower(t.s) order by t.d) from  
   (
      select 'abc' s, '2021-06-01'::date d union all
      select 'ABC' s, '2021-06-21'::date d 
   ) t
) t2 where row_number =1;

【讨论】:

以上是关于PostgreSQL:如何将大写/小写视为重复项,而不是更改大小写并保留较早的条目?的主要内容,如果未能解决你的问题,请参考以下文章

使用postgresql TEXT类型按字段排序时如何删除重复项?

规范化 postgresql 中的人名

在C ++中对字符向量进行排序并将大写字母和小写字母视为相同的最佳方法?

PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?

sencha touch :: 如果首字母小写或大写,如何让商店分拣机忽略

将列表中的大写字母转换成小写,并对比两个列表是否有重复