有没有办法在PostgreSQL中编写不区分大小写的查询,例如。我希望以下3个查询返回相同的结果。
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
答案 0 :(得分:354)
答案 1 :(得分:158)
使用ILIKE
代替LIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
答案 2 :(得分:106)
最常见的方法是将搜索字符串和数据小写或大写。但是有两个问题。
至少有三种不太常用的解决方案可能更有效。
CREATE INDEX ON groups (name::citext);
创建不区分大小写的索引。 (但见下文。)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模块不提供真正的不区分大小写的数据类型。相反,它表现得好像每个字符串都是小写的。也就是说,它就像你在每个字符串上调用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'