Чистый способ пользовательской сортировки

#sql #oracle

#sql #Oracle

Вопрос:

Я пытаюсь написать SELECT запрос с пользовательскими сортировками. Значения в STATE столбце могут быть active , suspended , inConstruction , и мне нужно, чтобы они были отсортированы в этом порядке.

Я сделал что-то вроде этого:

 select c.id, c.state from client c
where other_conditions = TRUE
and c.state in ('active', 'suspended', 'inConstruction') --adding this for clarity
order by replace(c.state, 'suspended', 'b_suspended') asc
  

Это гарантирует, что результаты будут в правильном порядке, но это действительно некрасиво. Есть ли более чистое, более «объективное» решение?

Ответ №1:

Вы можете добавить пользовательскую сортировку следующим образом:

 order by case c.state when 'active' then 1 when 'suspended' then 2 else 3 end
  

Ответ №2:

Может быть, вот так:

 select id, state
from (
select id
       , case when state = 'active' then
                   'A'
              when state = 'suspended' then
                   'B'
              when state = 'inConstruction' then
                   'C'
         end State_ord
       , state
from client)
order by State_ord;      
  

ДЕМОНСТРАЦИЯ

Или, может быть, с DECODE :

 select id, state
from (
select id
       , decode(state, 'active', 'A', 'suspended', 'B', 'C') State_ord
       , state
from client)
order by State_ord; 
  

Вы также можете использовать case when end и decode в предложении order by. Одно решение уже предоставлено, а другое:

 select id
       , state
from client
order by decode(state, 'active', 'A', 'suspended', 'B', 'C')
  

Комментарии:

1. DECODE это было именно то, что я искал, но я не мог найти название. Спасибо! Это намного легче, чем CASE .

2. Привет @TeleportingGoat, добро пожаловать, я рад помочь. Приветствия!

3. Обратите внимание, что в первых двух примерах вам не нужен подзапрос — вы можете упорядочивать по псевдонимам столбцов

4. @ChrisSaxon но в этом случае ему придется показывать три столбца…