J'essaye d'écrire une requête SELECT avec des tris personnalisés. Les valeurs de la colonne STATE peuvent être active, suspended, inConstruction, et j'ai besoin qu'elles soient triées dans cet ordre.

J'ai fait quelque chose comme ça:

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

Cela garantit que les résultats sont dans le bon ordre, mais c'est vraiment moche. Existe-t-il une solution plus propre et plus «objective»?

0
Teleporting Goat 16 sept. 2020 à 12:40

2 réponses

Meilleure réponse

Peut-être comme ça:

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;      

DEMO

Ou peut-être avec DECODE:

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

Vous pouvez également utiliser case when end et decode dans l'ordre par clause. Une solution est déjà fournie et l'autre est:

select id
       , state
from client
order by decode(state, 'active', 'A', 'suspended', 'B', 'C')
1
VBoka 16 sept. 2020 à 09:55

Vous pouvez ajouter un tri personnalisé comme celui-ci:

order by case c.state when 'active' then 1 when 'suspended' then 2 else 3 end
2
Marco Baldelli 16 sept. 2020 à 09:42