在Postgres中使用UPPER和LOWER进行排序

时间:2016-02-29 16:16:49

标签: postgresql

我对postgres很新,并想知道如何使用上(或下)函数对表进行排序,以进行不区分大小写的搜索。我知道我可以按照以下方式做点什么:

where b.name ~* '%Example%'

但是这种方法使我的查询有点慢。所以我想尝试以下内容。

假设表b是这样的:

order | name
1     | Example
2     | example
3     | EXAMPLE
4     | ExAmPlE

每当我使用查询时:

set schema 'schem';
    select  UPPER(b.name),
        from b
        where b.name like UPPER('%Example%');

它归结为查询本身。只要where子句是:

where b.name like UPPER('%Example%');

什么都没有显示。

where b.name like UPPER('%E%');

ExampleEXAMPLEExAmPlE以大写字母显示。

where b.name like UPPER('%EXAMPLE%'); 

仅显示EXAMPLE

也许我没有正确理解postgres,但upper函数是否仅在所有大写字母中显示其参数的数据?我认为发生的是我的查询将采用所有示例,强制它们为大写,然后where子句也将被强制为大写,因此每当我使用任何{{1}时上面提到的条款,每个查询都会吐出表where中的所有内容。

我是否被迫使用格式b或者我只是误解了这个?

1 个答案:

答案 0 :(得分:1)

Postgresql字符串区分大小写,如果要匹配upper()查询,则需要在列上使用upper。

如果您想搜索不区分大小写的内容,也可以使用ILIKE代替LIKE。

如果由于某种原因需要存储不区分大小写的文本,则会有一个扩展名citext

name LIKE '%argh%'name ~* 'argh'之间没有太大区别,这些与我们在此示例中使用它们的方式基本相同。然而,~*运算符更强大,因为它是不区分大小写的正则表达式匹配。 (区分大小写为~)。

如果您希望快速查询条件进行过滤,则可能需要重新考虑是否可以通过这种方式更改条件以匹配开头的字段。然后你可以使用普通的btree索引和upper:

create index b_name_idx on b (upper(name));

这称为功能索引(因为你使用了函数),并且为了让postgresql使用它你还必须在你的字段上使用upper

select * from b where upper(b.name) like 'argh%';

但是,如果必须检查包含,如果搜索的字符串可能位于中间位置,则可能需要使用pg_trgm extension

create extension pg_trgm;
create index b_name_trgmidx on b using gin (name gin_trgm_ops);

然后这两个人都可以使用索引:

select * from b where b.name like '%argh%';
select * from b where b.name ~* 'argh';