Postgres 排序不适用于使用整理的特殊字符

Postgres sorting is not working on special characters using collate

如果我使用 collat​​e 执行 postgresql 脚本,我得到的结果只用“.”排序。它不考虑'__'。我想要特殊字符“。”和“_”首先排序,然后是字母。

PostgreSQL:
SELECT * FROM test_spl_char ORDER BY CHR_NM COLLATE "C";
Output:
-----------
.GEMS
BISCUIT
CANDY
DONUT
YUM
_SHAKE

show lc_collate;
Output:
-----------
en_US.UTF-8

请帮助我先将结果按特殊字符排序。

实际上它确实同时考虑了 ._,并且做得很好。您期望所有 特殊字符 在错误的标准字母数字之前进行整理;特殊字符散布在字母和数字中。您可以从数据中看到这一点,方法是查看每个首字符的 ASCII 码(通过 Postgres function):

select char_nm, ascii(substr(char_nm,1,1)) 
  from test_spl_char
  order by char_nm collate "C";

请注意,结果实际上 根据 ASCII 码(内部代码)正确排序

您可以使用 regular expression 来确定 "class" 并对其进行排序,然后对实际值进行排序:

select * 
  from test_spl_char 
  order by char_nm ~ '^[A-Za-z0-9]' 
         , char_nm ; 

它的作用:正则表达式 char_nm ~ '^[A-Za-z0-9] 检查字符串的第一个字符,然后检查字母数字字符。如果它是 returns True 而不是 False。由于 Postgres 认为 false 比 true 少,所以特殊字符(非字母数字字符)将排在较低的位置,因此按升序排在第一位。然后完整值也按升序排序。

请参阅 demo 了解以上内容。