Postgres - Сортировать по заданному условию c - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть следующая таблица.

table1

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

Из пользовательского интерфейса я получаю управляемый пользователем параметр, который называется flag_priority.

У меня есть отсортировать результаты на основе следующего условия:

  • ПРИОРИТЕТ 1 - если flag1 = 1, flag2 = 1, flag3 = 1, flag4 = 1, то эти записи должны быть на вершине
  • ПРИОРИТЕТ 2 - если flag_priority == 'flag1', то упорядочить все строки, где flag1 = 1 и 2 из 3 других флагов 1
    • (flag1 = 1, flag2 = 1, flag3 = 1, flag4 = 0) ИЛИ (flag1 = 1, flag2 = 0, flag3 = 1, flag4 = 1) ИЛИ (flag1 = 1, flag2 = 1, flag3 = 0 , flag4 = 1)
  • если flag_priority == 'flag4', то упорядочить все строки, где flag4 = 1 и 2 из 3 других флагов: 1
    • ( flag1 = 0, flag2 = 1, flag3 = 1, flag4 = 1) ИЛИ (flag1 = 1, flag2 = 0, flag3 = 1, flag4 = 1) ИЛИ (flag1 = 1, flag2 = 1, flag3 = 0, flag4 = 1)
  • ПРИОРИТЕТ 3 - если flag_priority == 'flag1', то или Во всех строках, где flag1 = 1 и 1 из 3 других флагов: 1
    • (flag1 = 1, flag2 = 1, flag3 = 0, flag4 = 0) ИЛИ (flag1 = 1, flag2 = 0, flag3 = 1, flag4 = 0) ИЛИ (flag1 = 1, flag2 = 0, flag3 = 0, flag4 = 1)
  • если flag_priority == 'flag4', то упорядочить все строки, где flag4 = 1 и 1 из 3 других флагов: 1
    • (flag1 = 1, flag2 = 0, flag3 = 0, flag4 = 1) ИЛИ (flag1 = 0, flag2 = 1, flag3 = 0 , flag4 = 1) ИЛИ (flag1 = 0, flag2 = 0, flag3 = 1, flag4 = 1)
  • ПРИОРИТЕТ 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 для его заказа на основе вышеуказанных условий

1 Ответ

0 голосов
/ 24 февраля 2020

Я не буду расшифровывать все ваши условия, но вы можете использовать выражение CASE в ORDER BY. Идея состоит в том, чтобы преобразовать каждое условие в (одно) число, которое указывает позицию сортировки, что-то вдоль линий:

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

...