PostgreSQL排序

时间:2014-01-01 04:34:21

标签: sql postgresql sorting collation

我在PostgreSQL中遇到了以下数据的排序问题:

name
-----
@CF
@CG
CD
CE

我使用select name from table order by name,结果如下:

name
-----
CD
CE
@CF
@CE

似乎Postgres忽略了特殊字符@并对左字符串进行了排序。但是,我希望它像这样排序:

name
-----
@CF
@CG
CD
CE

搜索互联网没有帮助。我希望这里有人可以提出建议。

4 个答案:

答案 0 :(得分:4)

使用PostgreSQL's collation support告诉您需要特定的排序规则。

假设:

CREATE TABLE t AS VALUES ('CD'),('CE'),('@CF'),('@CE');

您可以使用以下方法强制执行逐字节归类:

SELECT * FROM t ORDER BY column1 COLLATE "C";

"C"排序规则是一种按字节顺序排列的排序规则,它忽略了国家语言规则,编码等。

答案 1 :(得分:2)

只需将其添加到order by子句中:

ORDER BY CASE WHEN LEFT(name,1) = '@' THEN 0 ELSE 1 END ASC, name ASC

答案 2 :(得分:2)

您未公开的collation设置显然会忽略排序顺序的@字符。切换到另一个排序规则suggested by @Craig。或者,如果您希望坚持对字符串的其余部分进行排序,请为引导@添加一个特殊情况。

在Postgres中,您可以直接按boolean值排序。默认顺序为FALSETRUENULL

ORDER BY name !~~ '@%', name

!~~NOT LIKE的Postgres简写。

答案 3 :(得分:0)

使用此:

SELECT name
      FROM table 
     ORDER BY name WHEN LEFT(name, 1) = '@' 
                   THEN 0 ELSE 1 END, name