【问题标题】:Postgresql show specific value first, order by different criteriaPostgresql 首先显示特定值,按不同标准排序
【发布时间】:2017-04-06 09:34:29
【问题描述】:

在这个小练习中,我需要先向人们展示“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  

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

【问题讨论】:

  • 向我们展示一些示例结果,按照您想要的方式订购。 (以及格式化文本。)

标签: sql postgresql sql-order-by


【解决方案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;

【讨论】:

  • 谢谢,我不知道!
【解决方案2】:

您可以将 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

【讨论】:

  • 感谢您的回复!
  • 为我工作,但我不得不重做一点:SELECT a.a=2 AS a2 FROM a ORDER BY a2 。这样我就能够在 SQLAlchemy 中实现它。我省略了::int,因为也可以订购布尔值。
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2016-11-03
  • 2019-10-18
相关资源
最近更新 更多