PostgreSQL中的SORT:带括号的字符串

时间:2014-02-10 18:57:33

标签: mysql postgresql

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

bbb
(ccc)
aaa
(eee)
ddd


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

aaa
bbb
(ccc)
ddd
(eee)


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

(ccc)
(eee)
aaa
bbb
ddd



知道为什么会发生这种情况,我该如何解决呢?


编辑:正如评论中所提到的,en_US.UTF-8排序规则似乎有罪。但我需要它用拉丁字符正确排序字符串。那么有没有正则表达式或替代整理解决问题?

1 个答案:

答案 0 :(得分:2)

如果您更喜欢整理C,为什么不在订单声明中明确使用它?

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);

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