Postgresql首先显示特定值,按不同标准排序

时间:2017-04-06 09:34:30

标签: sql postgresql sql-order-by

在这个小练习中,我需要向Zoetermeer"" Zoetermeer"首先和 按名称命名,具有相同名称的人需要通过" bondsnr" (这是一个唯一的号码), 除了" Zoetermeer"之外的其他人需要仅通过" bondsnr"

进行分类
select spelersnr, naam, plaats, bondsnr
from spelers
where bondsnr is not null
order by case when plaats = 'Zoetermeer' then 1
          else 2 end,
          bondsnr

这就是我现在所拥有的,但它不正确,我似乎无法找到解决方案。 排序来自" Zoetermeer"第一次工作,但我不知道如何按照他们的号码对同名的人进行排序

修改

spelersnr   naam       plaats      bondsnr    
    27     Cools      Zoetermeer    2513
   104   Moerman      Zoetermeer    7060
    44   Bakker, de     Rijswijk    1124
   112   Baalen, van   Rotterdam    1319
    83  Hofland         Den Haag    1608
     2  Elfring         Den Haag    2411
     8  Niewenburg      Rijswijk    2983
    57  Bohemen, van    Den Haag    6409
   100  Permentier      Den Haag    6524
     6  Permentier      Den Haag    8467  

这应该是这样的。 我的答案显示了相同的结果,但它不正确。 我想因为如果他们住在同一个地方,我不会按姓名订购

2 个答案:

答案 0 :(得分:1)

您不仅可以按单个列对查询进行排序,还可以按records对查询进行排序 因此,如果我正确理解您的要求:

select spelersnr, naam, plaats, bondsnr
from spelers
where bondsnr is not null
order by
  case
    when plaats = 'Zoetermeer' then
      (1,naam,bondsnr)
    else
      (2,null::text,bondsnr)
  end;

答案 1 :(得分:1)

您可以将bool转换为int,然后按您的首选条件排序。

示例:

with a (a, b, c) as (values (1, 2, 3), (2, 1, 3), (1, 3, 2), (2, 3, 2))
select * from a order by (a.a = 2)::int desc, b desc;
 a | b | c
---+---+---
 2 | 3 | 2
 2 | 1 | 3
 1 | 3 | 2
 1 | 2 | 3
(4 rows)

db_example=# with a (a, b, c) as (values (1, 2, 3), (2, 1, 3), (1, 3, 2), (2, 3, 2))
db_example-# select * from a order by (a.a = 2)::int desc, b asc;                                                  
  a | b | c                                                                                                              
 ---+---+---                                                                                                             
  2 | 1 | 3                                                                                                               
  2 | 3 | 2                                                                                                               
  1 | 2 | 3                                                                                                               
  1 | 3 | 2                                                                                                              
(4 rows)  

对于布尔值,true变为1,false变为0