postgresql - Postgres - 按特定条件排序
问题描述
我有下表。
表格1
id flag1 flag2 flag3 flag4
1 1 1 1 1
2 1 1 1 0
3 0 1 1 1
4 1 0 1 1
5 1 1 0 1
6 0 1 1 0
7 1 1 0 0
8 0 0 1 1
9 1 0 0 1
10 0 0 0 1
11 1 0 0 0
12 0 1 0 0
13 0 0 1 0
从 UI 中,我得到一个名为flag_priority
.
我必须根据以下条件对结果进行排序:
- PRIORITY 1 -- 如果 flag1 = 1,flag2 = 1,flag3 = 1,flag4 = 1,那么这些记录应该在顶部
- PRIORITY 2 -- 如果 flag_priority == 'flag1',则对所有 flag1 = 1 的行和 3 个其他标志中的 2 个为 1 的所有行进行排序
- (flag1 = 1, flag2 = 1, flag3 = 1, flag4 = 0) OR (flag1 = 1, flag2 = 0, flag3 = 1, flag4 = 1) OR (flag1 = 1, flag2 = 1, flag3 = 0, flag4 = 1)
- 如果 flag_priority == 'flag4',则对 flag4 = 1 的所有行和 3 个其他标志中的 2 个为 1 的所有行进行排序
- (flag1 = 0, flag2 = 1, flag3 = 1, flag4 = 1) OR (flag1 = 1, flag2 = 0, flag3 = 1, flag4 = 1) OR (flag1 = 1, flag2 = 1, flag3 = 0, flag4 = 1)
- PRIORITY 3 -- 如果 flag_priority == 'flag1',则对所有 flag1 = 1 的行和 3 个其他标志中的 1 个为 1 的行进行排序
- (flag1 = 1, flag2 = 1, flag3 = 0, flag4 = 0) OR (flag1 = 1, flag2 = 0, flag3 = 1, flag4 = 0) OR (flag1 = 1, flag2 = 0, flag3 = 0, flag4 = 1)
- 如果 flag_priority == 'flag4',则对所有 flag4 = 1 的行和 3 个其他标志中的 1 个为 1 的行进行排序
- (flag1 = 1, flag2 = 0, flag3 = 0, flag4 = 1) OR (flag1 = 0, flag2 = 1, flag3 = 0, flag4 = 1) OR (flag1 = 0, flag2 = 0, flag3 = 1, flag4 = 1)
- PRIORITY 4 -- 如果 flag_priority == 'flag1',则对 flag1 = 1 的所有行进行排序,并且 - 在 3 个其他标志中为 1
- (标志 1 = 1,标志 2 = 0,标志 3 = 0,标志 4 = 0)
- 如果 flag_priority == 'flag4',则对 flag4 = 1 和 0 的所有行进行排序,其中 3 个其他标志为 1
- (标志 1 = 1,标志 2 = 0,标志 3 = 0,标志 4 = 0)
如何编写 SQL 查询以根据上述条件对其进行排序?
解决方案
我不会破译您拥有的所有条件,但您可以在 ORDER BY 中使用 CASE 表达式。这个想法是将每个条件转换为一个(单个)数字,该数字指示排序位置,大致如下:
order by case
when flag1 = 1 and flag2 = 1 and flag3 = 1 and flag4 = 1 then 1
when (flag1 = and flag2 = 1 and flag3 = 1 and flag4 = 0)
or (...) then 2
when (flag1 = 1 and flag2 = 1 and flag3 = 0 and flag4 = 0)
or (...) then 3
end
如果这都是函数的一部分,您也可以在 CASE 表达式中引用函数参数,例如
when flag_parameter = 'flag1'
AND ((flag1 = 1 and flag2 = 1 and flag3 = 0 and flag4 = 0)
or (...)) then ...
我想知道为什么您不对boolean
这些标志使用正确的(这会使表达式也更简单一些,例如:when flag1 and flag2 and flag3 and flag4
推荐阅读
- browser-cache - 子域是否共享缓存配额?
- neo4j - Neo4j 中的邻域聚合查询
- python - Python绘图图像保存错误
- algorithm - 确定是否有任何组合从设定的总和到目标值
- c# - 这是使用 System.Net 的正确方法吗?
- docker-compose - Docker 启动失败,命名管道错误
- python-3.x - Python3:如何使用另一个列表项删除列表项
- linux - SysVinit 脚本在其依赖项重新启动后如何重新启动
- c# - NetCore 2.1 Generic Host as a service
- java - java for循环与手动代码