【问题标题】:PostgreSQL SortPostgreSQL 排序
【发布时间】:2014-01-01 04:34:21
【问题描述】:
我在 PostgreSQL 中有以下数据的排序问题:
name
-----
@CF
@CG
CD
CE
我用select name from table order by name,结果如下:
name
-----
CD
CE
@CF
@CE
似乎 Postgres 只是忽略了特殊字符 @ 并对左侧字符串进行排序。但是,我希望它像这样排序:
name
-----
@CF
@CG
CD
CE
搜索互联网没有帮助。希望有大神给点建议。
【问题讨论】:
标签:
sql
postgresql
sorting
collation
【解决方案1】:
使用PostgreSQL's collation support 告诉它您需要特定的排序规则。
给定:
CREATE TABLE t AS VALUES ('CD'),('CE'),('@CF'),('@CE');
您可以使用以下命令强制按字节排序:
SELECT * FROM t ORDER BY column1 COLLATE "C";
"C" 排序规则是忽略国家语言规则、编码等的按字节排序规则。
【解决方案2】:
只需将其添加到 order by 子句中:
ORDER BY CASE WHEN LEFT(name,1) = '@' THEN 0 ELSE 1 END ASC, name ASC
【解决方案3】:
您未公开的collation 设置显然忽略了用于排序顺序的@ 字符。切换到另一个排序规则为suggested by @Craig。或者,如果您想对字符串的其余部分坚持排序规则,请为前导 @ 添加一个特殊情况。
在 Postgres 中,您可以直接按 boolean 值订购。默认顺序为FALSE、TRUE、NULL。
ORDER BY name !~~ '@%', name
!~~ 是 NOT LIKE 的 Postgres 简写。
【解决方案4】:
使用这个:
SELECT name
FROM table
ORDER BY name WHEN LEFT(name, 1) = '@'
THEN 0 ELSE 1 END, name