【问题标题】:Is there a PostgreSQL setting that I can use to do case-insensitive queries on column values?是否有 PostgreSQL 设置可用于对列值进行不区分大小写的查询?
【发布时间】:2013-04-02 22:35:29
【问题描述】:

我已经使用 MySQL 9 年了,现在有一个新的 Rails 3.2 应用程序,我在其中使用 PostgreSQL。我被我为项目带来的几个假设所困扰。

使用 MySQL,我可以设置数据库设置,以便:

plan = Plan.find_by_name("platinum")

将返回一条记录,即使数据库中的值为Platinum。使用 PostgreSQL 的默认设置,它不会那样工作。

我确定这一定是一个常见问题。我当然不希望我的客户必须输入完全匹配的大小写。由于某种原因,我在网上找不到任何东西,我只是在 PostgreSQL 的网站上找到了 10 年前不支持此功能的支持案例。希望它现在已经改变了。

已解决:

感谢下面的回答,这里是如何做到这一点:

在 Postgres 9.1+ 中,citext contrib 模块随代码一起提供。您需要做的就是在 psql 命令行中输入:

create extension citext

现在您可以使用 citext 列类型创建表:

create table people (name ctext);

插入一些行进行测试:

insert into people (name) values ('ADRIAN');
insert into people (name) values ('adrian');

并测试:

select * from people where name = 'Adrian';

结果:

  name  
--------
 adrian
 ADRIAN
(2 rows)

【问题讨论】:

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


【解决方案1】:

您可以使用citext contrib module 将列定义为citext

另一种选择是使用不带通配符的ilike。如果存在,这仍将使用 b-tree 索引,如果不是默认 btree,则至少使用 text_pattern_ops 索引。您需要转义 pattern matching 中记录的 LIKE 表达式元字符,以防止意外的通配符搜索。

就个人而言,我真的希望看到 COLLATE 添加不区分大小写的选项,因为现在支持每个表达式 COLLATE...但现在,这是挥手的未来的东西。

【讨论】:

  • 你是男人。那很简单。使用快速方法更新问题。
猜你喜欢
  • 2010-12-24
  • 2014-01-19
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多