Я не буду расшифровывать все ваши условия, но вы можете использовать выражение 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