PostgreSQL大小写不敏感排序

pg12开始支持不区分大小写,或者区分大小写的排序的collate。

语法:

CREATE COLLATION [ IF NOT EXISTS ] name (
    [ LOCALE = locale, ]
    [ LC_COLLATE = lc_collate, ]
    [ LC_CTYPE = lc_ctype, ]
    [ PROVIDER = provider, ]
    [ DETERMINISTIC = boolean, ]
    [ VERSION = version ]
)
CREATE COLLATION [ IF NOT EXISTS ] name FROM existing_collation

其中几个关键参数:
PROVIDER:指定用于与此排序规则相关的区域服务的提供程序。可能的值是: icu、libc。 默认 是libc。但若要设置大小写不敏感,目前只支持icu。
DETERMINISTIC:设置成not deterministic表示大小写不敏感。

例子:
–正常情况的排序
我们可以看到,正常的order by会区分大小写。

bill@bill=>create table test (c1 text);  
CREATE TABLE
bill@bill=>insert into test values ('a'),('b'),('c'),('A'),('B'),('C');  
INSERT 0 6
bill@bill=>select * from test order by c1;
 c1 
----
 A
 B
 C
 a
 b
 c
(6 rows)

同样,在oracle中也是一样:

SQL> select * from test order by c1;

C1
--------------------------------------------------------------------------------
A
B
C
a
b
c

6 rows selected.

–不区分大小写排序
可以看到我们指定collate为zh_CN时便没有区分大小写排序。

bill@bill=>select * from test order by c1 collate "zh_CN";  
 c1 
----
 a
 A
 b
 B
 c
 C
(6 rows)

我们也可以自定义collation支持不区分大小写的排序,但是需要注意在编译数据库的时候加上 --with-icu才可以,否则会出现报错:

bill@bill=>CREATE COLLATION case_insensitive (provider = icu, locale = 'zh_Hans', deterministic = false);
ERROR:  ICU is not supported in this build
HINT:  You need to rebuild PostgreSQL using --with-icu.

正常情况:

bill@bill=> CREATE COLLATION case_insensitive (provider = icu, locale = 'zh_Hans', deterministic = false);  
CREATE COLLATION 
bill@bill=> select * from test order by c1 collate "case_insensitive";  
 c1   
----  
 a  
 A  
 b  
 B  
 c  
 C  
(6 rows)  

目前collate不支持=操作不区分大小写,目前需要citext插件。

发布了116 篇原创文章 · 获赞 50 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/104779261