【问题标题】:Postgres - Sort by specific conditionPostgres - 按特定条件排序
【发布时间】:2020-02-24 09:36:18
【问题描述】:

我有下表。

表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 和 2 的所有行进行排序,其中 3 个其他标志为 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 和 2 的所有行排序为 3 个其他标志为 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
    • (flag1 = 1, flag2 = 0, flag3 = 0, flag4 = 0)
  • 如果 flag_priority == 'flag4',则将 flag4 = 1 和 0 的所有行排序为 3 个其他标志为 1
    • (flag1 = 1, flag2 = 0, flag3 = 0, flag4 = 0)

如何编写 SQL 查询以根据上述条件对其进行排序?

【问题讨论】:

    标签: postgresql sql-order-by


    【解决方案1】:

    我不会解读您拥有的所有条件,但您可以在 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

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 2019-02-28
      • 2021-09-11
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      相关资源
      最近更新 更多