如何使“不区分大小写”;查询Postgresql?

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

SELECT id FROM groups where name='administrator'


SELECT id FROM groups where name='ADMINISTRATOR'


SELECT id FROM groups where name='Administrator'
450601 次浏览

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

试试这个:

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

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

    它适用于英语,但不是所有语言。(也许根本就不在 大多数语言)。不是每个小写字母都有对应的 大写字母;不是每个大写字母都有对应的 李小写字母。< / >
  1. 使用lower()和upper()这样的函数会给你一个顺序 扫描。它不能使用索引。在我的测试系统中,使用lower() 大约比可以使用索引的查询长2000倍。(测试数据略多于100k行)

至少有三种不太常用的解决方案可能更有效。

  1. 使用citext模块,它主要模仿不区分大小写的数据类型的行为。加载该模块后,可以通过CREATE INDEX ON groups (name::citext);创建一个不区分大小写的索引。(详见下文。)
  2. 使用不区分大小写的排序规则。这是在初始化a时设置的 数据库。使用不区分大小写的排序规则意味着您可以接受 几乎任何格式的客户端代码,您仍然会返回 有用的成果。(这也意味着您不能进行区分大小写的查询。李咄。)< / >
  3. 创建函数索引。使用 Create创建小写索引 (.);这样,你就可以利用了 但是,你必须还记得才能使用LOWER()

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

你也可以阅读ILIKE关键字。尽管它不符合SQL标准,但有时它非常有用。有关更多信息,请参见这里:http://www.postgresql.org/docs/9.2/static/functions-matching.html

你可以使用ILIKE。即。

SELECT id FROM groups where name ILIKE 'administrator'

使用ILIKE代替LIKE

SELECT id FROM groups WHERE name ILIKE 'Administrator'

您还可以使用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 ILIKE 'Administrator'
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的背景和名称是一个变量 使用< / p >
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'