如何编写不区分大小写的查询,只返回Rails中的唯一记录

时间:2017-05-03 03:48:41

标签: ruby-on-rails postgresql rails-activerecord

我正在使用Rails 4和PostgreSQL并尝试找出一种编写不区分大小写的查询方法的方法,该方法返回记录,使得您只获得一个不区分大小写的重复项。举一个简单的例子,假设您有一个代表已发送电子邮件的Email模型,并且有idtofrom,您的数据如下所示:

id| to              | from
------------------------------------
1 | tester@test.com | sender@test.com
2 | TESTER@TEST.com | sender@test.com
3 | foo@test.com    | sender@test.com

我希望查询方法只返回:

[<#Email:0x1234 id: 1, to: "tester@test.com", from: "sender@test.com">, <#Email:0x1224 id: 3, to: "foo@test.com", from: "sender@test.com">]

所以基本上我只想要一条记录,如果在忽略大小写的情况下结果是匹配的话。这是否可以在单行中进行并让数据库返回正确的记录,还是有另一种巧妙的方法可以做到这一点?我出于某种原因撞墙,非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用Postgres Window功能执行此操作。您需要查看row_number()函数。

以下是如何达到预期效果的方法:

select id,fro,tos
FROM
(
select id,fro,
tos, row_number() over (partition by LOWER(tos)  ORDER BY LOWER(tos) DESC) AS alpharow
from stacks
) flattened
where alpharow = 1

我必须使用“to”和“from”的替代名称,因为这些是保留字 - 但在你的例子中,它们应该很明显地映射了什么。

一些后续阅读材料:

https://buildingvts.com/understanding-postgres-window-functions-697bc0ff2ed4

https://robots.thoughtbot.com/postgres-window-functions