gpt4 book ai didi

mysql - PostgreSQL 中的排序 : strings with parenthesis

转载 作者:行者123 更新时间:2023-11-29 08:10:39 26 4
gpt4 key购买 nike

我刚刚在 PostgreSQL 中发现了一些非常奇怪的东西。假设我们有一列“name”,其值类似于

bbb
(ccc)
aaa
(eee)
ddd


如果我执行 SELECT (...) ORDER BY name ASC,结果是

aaa
bbb
(ccc)
ddd
(eee)


这非常聪明,但我以前在 MySQL 中拥有的(也是我现在真正想要的)是

(ccc)
(eee)
aaa
bbb
ddd



知道为什么会发生这种情况以及如何解决它吗?


编辑:正如评论中提到的,看起来罪魁祸首在于 en_US.UTF-8 排序规则。但我需要它来正确地对带有拉丁字符的字符串进行排序。那么是否有任何正则表达式或替代排序规则可以解决该问题?

最佳答案

如果您更喜欢排序规则 C,为什么不在 order 语句中显式使用它?

SELECT name FROM t ORDER BY (name COLLATE "C");

适用于我的系统。

或者,如果具体而言,您想忽略具有不同重音的相同字母之间的差异(例如排序规则 en-US 等),但不要忽略括号(例如排序规则 C ),您可以使用 unaccent() 去除重音符号,然后继续使用 C。 (尽管这可能会给您在同一字母内随机排序。)

SELECT name FROM t ORDER BY (unaccent(name) COLLATE "C");

查看如何让 unaccent() 工作(如果尚未): Error when creating unaccent extension on PostgreSQL

如果您的问题恰好是在第一个字符上使用左括号,则另一种解决方案如下:

SELECT name FROM t ORDER BY (NOT substring(name from 1 for 1)='(', name);

如果这还不够,我建议重新思考为什么不忽略括号对您如此重要,以及您是否可以将该信息包含在另一列等中。

关于mysql - PostgreSQL 中的排序 : strings with parenthesis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com