[英]How to not evaluate the ELSE part of a PostgreSQL CASE expression
[英]Why does PostgreSQL sort part case-sensitively and part case-insensitively?
我无法理解 PostgreSQL (v11.10) 的行为。 这是我所做的:
create temp table test (first_name text, last_name text);
insert into test values
('Hanna', 'Beat'),
('JOAN', 'BEET'),
('Mark', 'Bernstein'),
('ALFRED', 'DOE'),
('henry', 'doe'),
('Henry', 'Doe'),
('Dennis', 'Doe');
select last_name, first_name from test order by last_name, first_name;
这就是我得到的。
last_name | first_name
-----------+------------
Beat | Hanna
BEET | JOAN
Bernstein | Mark
doe | henry
Doe | Dennis
Doe | Henry
DOE | ALFRED
(7 rows)
看起来前三个名称的排序不区分大小写,但后四个名称的排序区分大小写。 为什么?
换句话说,如果排序区分大小写,我希望顺序如下:
last_name | first_name
-----------+------------
Beat | Hanna
Bernstein | Mark
BEET | JOAN
doe | henry
Doe | Dennis
Doe | Henry
DOE | ALFRED
(7 rows)
如果它不区分大小写,我希望这样:
last_name | first_name
-----------+------------
Beat | Hanna
BEET | JOAN
Bernstein | Mark
DOE | ALFRED
Doe | Dennis
doe | henry
Doe | Henry
(7 rows)
相反,我得到的是两者的混合,这让我感到困惑......
为了完整性:
# show lc_collate; show lc_ctype;
lc_collate
-------------
en_US.UTF-8
(1 row)
lc_ctype
-------------
en_US.UTF-8
(1 row)
自然语言排序比你想象的要复杂。 他们使用不同的比较级别,当字符串在较低级别比较相等时,较高级别用作决胜局。 通常,在初级阶段忽略重音和大小写。 在中学阶段,重音得到尊重,但大小写被忽略。 在第三级,大小写和口音受到尊重。
因此,字符串Etat
、 état
和etat
在主要级别上比较相同。 在中等水平上, état
将大于其他两个,这将是相等的。 在高等教育层面, etat
将小于Etat
。 总而言之,我们最终得到
'etat' < 'Etat' < 'état'
大写字符大于小写字符有点随意,使用 ICU 排序规则,您可以配置大部分这些方面。
在您的示例中, BEET
在初级级别上低于Bernstein
,因此这就是字符串排序的顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.