Postgresql首先显示特定值,按不同标准排序
Postgresql show specific value first, order by different criteria
在这个小练习中,我需要先向 "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
这是应该的。
我的回答显示相同的结果,但不正确。
我想是因为如果他们住在同一个地方,我不会按名字点菜
您不仅可以按单个列对查询进行排序,还可以按 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;
您可以将 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
在这个小练习中,我需要先向 "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
这是应该的。 我的回答显示相同的结果,但不正确。 我想是因为如果他们住在同一个地方,我不会按名字点菜
您不仅可以按单个列对查询进行排序,还可以按 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;
您可以将 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