【问题标题】: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 值订购。默认顺序为FALSETRUENULL

        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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-28
            • 2013-03-17
            • 2014-01-10
            • 1970-01-01
            相关资源
            最近更新 更多