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

时间:2011-08-10 02:42:08

标签: postgresql

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

SELECT id FROM groups where name='administrator'

SELECT id FROM groups where name='ADMINISTRATOR'

SELECT id FROM groups where name='Administrator'

8 个答案:

答案 0 :(得分:354)

在比较之前使用LOWER函数将字符串转换为小写。

试试这个:

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

答案 1 :(得分:158)

使用ILIKE代替LIKE

SELECT id FROM groups WHERE name ILIKE 'Administrator'

答案 2 :(得分:106)

最常见的方法是将搜索字符串和数据小写或大写。但是有两个问题。

  1. 它适用于英语,但不适用于所有语言。 (也许甚至没有 大多数语言。)并非每个小写字母都有相应的 大写字母;不是每个大写字母都有对应的 小写字母。
  2. 使用lower()和upper()等函数将为您提供顺序 扫描。它不能使用索引。在我的测试系统上,使用lower() 比可以使用索引的查询长大约2000倍。 (测试数据有超过10万行。)
  3. 至少有三种不太常用的解决方案可能更有效。

    1. 使用citext module,它主要模仿不区分大小写的数据类型的行为。加载该模块后,您可以按CREATE INDEX ON groups (name::citext);创建不区分大小写的索引。 (但见下文。)
    2. 使用不区分大小写的排序规则。这是在初始化时设置的 数据库。使用不区分大小写的排序规则意味着您可以接受 几乎任何客户端代码格式,你仍然会返回 有用的结果。 (这也意味着你不能做区分大小写的查询。杜。)
    3. 创建功能索引。使用CREATE INDEX ON groups (LOWER(name));创建小写索引。完成后,你可以利用 包含SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');SELECT id FROM groups WHERE LOWER(name) = 'administrator';等查询的索引,你必须记住才能使用LOWER()。

    4. citext模块不提供真正的不区分大小写的数据类型。相反,它表现得好像每个字符串都是小写的。也就是说,它就像你在每个字符串上调用lower()一样,就像上面的数字3一样。优点是程序员不必记住小写字符串。但在决定使用citext之前,您需要阅读文档中的“字符串比较行为”和“限制”部分。

答案 3 :(得分:90)

您可以使用ILIKE。即。

SELECT id FROM groups where name ILIKE 'administrator'

答案 4 :(得分:49)

您还可以阅读ILIKE关键字。它有时非常有用,尽管它不符合SQL标准。有关详细信息,请参阅此处:http://www.postgresql.org/docs/9.2/static/functions-matching.html

答案 5 :(得分:23)

你也可以使用POSIX正则表达式,比如

SELECT id FROM groups where name ~* 'administrator'

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

答案 6 :(得分:4)

借助INSTR的功能,使用~*可以大大提高性能。

SELECT id FROM groups WHERE name ~* 'adm'

返回名称中包含OR的行等于“ adm”。

答案 7 :(得分:0)

ILIKE 在这种情况下工作:

SELECT id 
  FROM groups
 WHERE name ILIKE 'Administrator'