想要在Postgres中对数据进行排序

时间:2017-02-06 09:00:09

标签: sql postgresql sql-order-by

我想按字母数字列对搜索结果进行排序,以便首先显示带字母的行,最后显示带有数字字符的行。

当前结果

12
13
14
aa
ab
bb
bd

预期结果

aa
ab
bb
bd
11
12
13

4 个答案:

答案 0 :(得分:1)

您可以检查字符串是否区分大小写:

with a_table(col) as (
values
    ('12'), ('13'), ('14'), ('aa'), ('ab'), ('bb'), ('bd')
)

select *
from a_table
order by lower(col) = upper(col), col;

 col 
-----
 aa
 ab
 bb
 bd
 12
 13
 14
(7 rows)    

答案 1 :(得分:0)

SELECT ... FROM table order by CASE WHEN column < 'A' THEN lpad(column, size, '0') ELSE column END;

希望这会奏效。

答案 2 :(得分:0)

... ORDER BY (mycol SIMILAR TO '[0-9]*'), mycol

答案 3 :(得分:0)

您想要使用

对字符应用特定的排序顺序
  • a = A
  • a&lt; B'/ LI>
  • z&lt; 0

您可以通过重新排列字符串中的字符来实现此目的,例如: 'a' - &gt; '01',b - &gt; '02','0' - &gt; '90','1' - &gt; '91','abc123' - &gt; '010203919293'。你可以为此编写一个函数,然后从你的查询中调用。

select col
from mytable
order by get_sortkey(col);

一个简单的替代方案可能是使用TRANSLATE函数。缺点:它仅用另一个单个字符替换每个字符,而不是如上例中的两个或更多个字符。知道我们可以使用的ASCII码:

select col
from mytable
order by translate(col,
                   'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
                   '0123456789ABCDEFGHIJKLMNOP0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                  ) collate "C";