在PostgreSQL中有没有办法编写不区分大小写的查询,例如我希望以下三个查询返回相同的结果。
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
在PostgreSQL中有没有办法编写不区分大小写的查询,例如我希望以下三个查询返回相同的结果。
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
LIKE 'xxx%'
查询一起使用,请指定 varchar_pattern_ops
,即 CREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
。 - sayapILIKE
,它可以工作,但响应速度较慢。为了快速访问基于计算结果的表,我建议任何人只需检查已接受的答案。在这里和这里查看更多详细信息。 - Afolabi Olaoluwa使用 ILIKE
代替 LIKE
SELECT id FROM groups WHERE name ILIKE 'Administrator'
ILIKE
。 - AnTorg.hibernate.dialect.PostgreSQL94Dialect
和 Spring Boot 2.0.6.RELEASE 一起使用。但 IntelliJ 对此表示不满。 - skaveeshname ILIKE 'Administrator'
和 LOWER(name)=LOWER('Administrator')
之间的区别是5000毫秒(尝试了gist和gin trgm索引,结果相似),而btree lower index
只需要5毫秒。请勿使用此方法。 - undefinedCREATE 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 之前,您需要阅读文档中的“字符串比较行为”和“限制”部分。
col ='a'
和col ='b'
一样)。关于#2:正如你所说,你可以在表达式上创建索引,所以这并不是真正的问题。但我同意你的观点,改变排序规则很可能是最好的解决方案。 - Vincent Savardselect * from pg_collation;
查看PostgreSQL认为哪些排序规则可用。 - Mike Sherrill 'Cat Recall'ILIKE
,例如。SELECT id FROM groups where name ILIKE 'administrator'
您也可以了解一下 ILIKE
关键字。它在某些情况下非常有用,尽管它不符合SQL标准。更多信息请参见此处:http://www.postgresql.org/docs/9.2/static/functions-matching.html
email ILIKE 'user-input-email-here'
这样的查询语句,请确保对用户输入进行转义。否则,人们可以输入像%这样的字符来匹配任何内容。 - Matt De LeonILIKE
和prepared statements
,这会保护我免受sql注入
吗? - slevinlower(column_name) like %expression%
慢。 - Patryk Imosa您也可以使用POSIX正则表达式,例如
SELECT id FROM groups where name ~* 'administrator'
SELECT 'asd' ~* 'AsD'
returns t
使用 ILIKE
select id from groups where name ILIKE 'adminstration';
如果您来自expressjs背景,且名称是变量,请使用:
select id from groups where name ILIKE $1;
使用~*
可以大大提高性能,具有INSTR的功能。
SELECT id FROM groups WHERE name ~* 'adm'
返回姓名包含OR等于'adm'的行。
~*
不是完全不区分大小写的匹配。它是正则表达式模式匹配。在您的示例中,如果 db 包含 ADM
,则 where name ~* 'Adm'
或 where name ~* 'Ad'
将产生结果。请改用 ILIKE
。 - nabster在这种情况下,ILIKE是有效的:
SELECT id
FROM groups
WHERE name ILIKE 'Administrator'
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION lower_unaccent(input text)
RETURNS text
LANGUAGE plpgsql
AS $function$
BEGIN
return lower(unaccent(input));
END;
$function$;
select lower_unaccent('Hôtel')
>> 'hotel'