4

我正在尝试对 Postgres 数据库中的字符列进行排序:

Select column1 from table order by column1

输出

dir1 
dir2
dir3
#num1
t1

我希望排序#num1首先以 sqlite 的方式打印。有什么想法我需要在查询中更改吗?

4

3 回答 3

5

一种可能的解决方案是“禁用”这种排序规则设置:

WITH x(a) AS (VALUES
  ('dir1')
 ,('dir2')
 ,('dir3')
 ,('#num1')
 ,('t1')
 )
SELECT *
FROM   x
ORDER  BY a COLLATE "C";

单个表达式的 Ad-hoc Collat​​ion需要 PostgreSQL 9.1 或更高版本。

大多数语言环境会忽略排序的前导#。如果切换到"C",字符将按其字节值有效排序。不过,这可能是也可能不是您想要的。

许多相关问题,例如这里:
PostgreSQL UTF-8 binary collat​​ion

于 2013-06-21T00:04:23.257 回答
1

#按排序顺序放在首位的蛮力版本

SELECT column1 
  FROM table1 
 ORDER BY CASE WHEN LEFT(column1, 1) = '#' 
               THEN 0 ELSE 1 END, column1

这是SQLFiddle演示。

这可能不是您想要的

于 2013-06-21T04:03:34.527 回答
1

您可以使用有序字段的 ASCII 值:

SELECT column1 FROM table ORDER BY ascii(column1)

特殊字符 ASCII 值低于字母值。

输出

#num1
dir1 
dir2
dir3
t1
于 2015-10-08T12:18:53.733 回答