PostgreSQL:如何做“不区分大小写”的查询

有没有办法在PostgreSQL中写不区分大小写的查询,例如,我希望以下3个查询返回相同的结果。

SELECT id FROM groups where name='administrator' SELECT id FROM groups where name='ADMINISTRATOR' SELECT id FROM groups where name='Administrator' 

比较之前,使用LOWER函数将string转换为小写字母。

尝试这个:

 SELECT id FROM groups WHERE LOWER(name)=LOWER('Administrator') 

最常见的方法是searchstring和数据的小写字母或大写字母。 但是有两个问题。

  1. 它用英文,但不是所有的语言。 (甚至在大多数语言中也可能不是。)不是每个小写字母都有相应的大写字母。 不是每个大写字母都有相应的小写字母。
  2. 使用像lower()和upper()这样的函数会给你一个顺序扫描。 它不能使用索引。 在我的testing系统上,使用lower()比可以使用索引的查询长约2000倍。 (testing数据有超过10万行)

至less有三个不太经常使用的解决scheme可能更有效。

  1. 使用citext模块 ,主要模仿不区分大小写的数据types的行为。 加载该模块后,可以通过CREATE INDEX ON groups (name::citext);创build不区分大小写的索引CREATE INDEX ON groups (name::citext); 。 (但是请看下面)
  2. 使用不区分大小写的sorting规则。 这是初始化数据库时设置的。 使用不区分大小写的sorting规则意味着您可以接受任何格式的客户端代码,并且您仍将返回有用的结果。 (这也意味着你不能做大小写敏感的查询,Duh。)
  3. 创build一个function索引。 使用CREATE INDEX ON groups (LOWER(name));创build一个小写索引CREATE INDEX ON groups (LOWER(name)); 。 这样做,你可以利用查询的优势,如SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR'); ,或SELECT id FROM groups WHERE LOWER(name) = 'administrator'; 不过你必须记得使用LOWER()。

citext模块不提供真正的不区分大小写的数据types。 相反,它的行为就像每个string都是小写字母。 也就是说,它的行为就像你在每个string上调用lower() ,如上面的数字3所示。 好处是程序员不必记住小写string。 但在决定使用citext之前,您需要阅读文档中的“string比较行为”和“限制”部分。

使用ILIKE而不是LIKE

 SELECT id FROM groups WHERE name ILIKE 'Administrator' 

你可以使用ILIKE 。 即

 SELECT id FROM groups where name ILIKE 'administrator' 

您也可以阅读ILIKE关键字。 有时候它可能会非常有用,尽pipe它不符合SQL标准。 有关更多信息,请参见此处: http : //www.postgresql.org/docs/9.2/static/functions-matching.html

你也可以使用POSIX正则expression式

 SELECT id FROM groups where name ~* 'administrator' 

SELECT 'asd' ~* 'AsD'返回t