#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 но в этом случае ему придется показывать три столбца…