![](/img/trans.png)
[英]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.