我刚刚在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排序规则似乎有罪。但我需要它用拉丁字符正确排序字符串。那么有没有正则表达式或替代整理解决问题?
答案 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);
如果这还不够,我建议重新考虑为什么不忽略括号对您来说如此重要,以及是否可以将该信息包含在另一列等中。