有没有办法在PostgreSQL中编写不区分大小写的查询,例如,我想下面3个查询返回相同的结果。
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
有没有办法在PostgreSQL中编写不区分大小写的查询,例如,我想下面3个查询返回相同的结果。
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
在比较之前,使用LOWER函数将字符串转换为小写。
试试这个:
SELECT id
FROM groups
WHERE LOWER(name)=LOWER('Administrator')
最常见的方法是将搜索字符串和数据小写或大写。但这有两个问题。
它适用于英语,但并非适用于所有语言。(也许根本就不在 大多数语言)。不是每个小写字母都有对应的 大写字母;不是每个大写字母都有对应的 小写字母。 使用lower()和upper()这样的函数将为您提供一个顺序 扫描。它不能使用索引。在我的测试系统中,使用lower() 大约比可以使用索引的查询长2000倍。(测试数据有10万多行。)
至少有三种不太常用的解决方案可能更有效。
Use the citext module, which mostly mimics the behavior of a case-insensitive data type. Having loaded that module, you can create a case-insensitive index by CREATE INDEX ON groups (name::citext);. (But see below.) Use a case-insensitive collation. This is set when you initialize a database. Using a case-insensitive collation means you can accept just about any format from client code, and you'll still return useful results. (It also means you can't do case-sensitive queries. Duh.) Create a functional index. Create a lowercase index by using CREATE INDEX ON groups (LOWER(name));. Having done that, you can take advantage of the index with queries like SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');, or SELECT id FROM groups WHERE LOWER(name) = 'administrator'; You have to remember to use LOWER(), though.
citext模块并没有提供真正不区分大小写的数据类型。相反,它的行为就好像每个字符串都是小写的。也就是说,它的行为就像您在每个字符串上调用了lower(),如上面的第3条所示。这样做的好处是程序员不需要记住小写字符串。但是在你决定使用citext之前,你需要阅读文档中的“字符串比较行为”和“限制”部分。
您还可以阅读ILIKE关键字。尽管它不符合SQL标准,但有时它非常有用。更多信息请访问:http://www.postgresql.org/docs/9.2/static/functions-matching.html
您还可以使用POSIX正则表达式,例如
SELECT id FROM groups where name ~* 'administrator'
SELECT 'asd' ~* 'asd'返回t
使用~*可以通过INSTR的功能极大地提高性能。
SELECT id FROM groups WHERE name ~* 'adm'
返回name包含OR = 'adm'的行。
select id from groups where name in ('administrator', 'ADMINISTRATOR', 'Administrator')
对于不区分大小写的参数化查询,您可以使用以下语法:
"select * from article where upper(content) LIKE upper('%' || $1 || '%')"
限制使用ILIKE
select id from groups where name ILIKE 'adminstration';
如果你来,expressjs的背景和名称是一个变量 使用
select id from groups where name ILIKE $1;
-- Install 'Case Ignore Test Extension'
create extension citext;
-- Make a request
select 'Thomas'::citext in ('thomas', 'tiago');
select name from users where name::citext in ('thomas', 'tiago');
如果你不仅想要大写/小写,还想要变音符,你可以实现你自己的func:
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION lower_unaccent(input text)
RETURNS text
LANGUAGE plpgsql
AS $function$
BEGIN
return lower(unaccent(input));
END;
$function$;
调用是then
select lower_unaccent('Hôtel')
>> 'hotel'