我在PostgreSQL中遇到了以下数据的排序问题:
name
-----
@CF
@CG
CD
CE
我使用select name from table order by name
,结果如下:
name
-----
CD
CE
@CF
@CE
似乎Postgres忽略了特殊字符@
并对左字符串进行了排序。但是,我希望它像这样排序:
name
-----
@CF
@CG
CD
CE
搜索互联网没有帮助。我希望这里有人可以提出建议。
答案 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
值排序。默认顺序为FALSE
,TRUE
,NULL
。
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