Postgres 排序不适用于使用整理的特殊字符
Postgres sorting is not working on special characters using collate
如果我使用 collate 执行 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 了解以上内容。
如果我使用 collate 执行 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 了解以上内容。