86 votes

Expression CASE .. WHEN dans Oracle SQL

J'ai un tableau avec 1 colonne et les données suivantes

Status
a1
i
t
a2
a3

Je veux afficher le résultat suivant dans ma requête de sélection

Status| STATUSTEXT
a1    | Active
i     | Inactive
t     | Terminated
a2    | Active
a3    | Active

Un moyen auquel j'ai pensé est l'utilisation d'une expression Switch When dans une requête de sélection.

SELECT
status,
CASE status 
WHEN 'a1' THEN 'Active'
WHEN 'a2' THEN 'Active'
WHEN 'a3' THEN 'Active'
WHEN 'i' THEN 'Inactive'
WHEN 't' THEN 'Terminated'
END AS StatusText
FROM stage.tst

Y a-t-il un autre moyen de faire cela sans avoir à écrire Lorsque l'expression 3 fois pour le statut actif et l'ensemble du statut actif peut être vérifié en une seule expression ?

141voto

astander Points 83138

Vous pourriez utiliser un IN clause

Quelque chose comme

SELECT
  status,
  CASE
    WHEN STATUS IN('a1','a2','a3')
    THEN 'Active'
    WHEN STATUS = 'i'
    THEN 'Inactive'
    WHEN STATUS = 't'
    THEN 'Terminated'
  END AS STATUSTEXT
FROM
  STATUS

Jetez un coup d'œil à cette démo

DEMO de SQL Fiddle

19voto

Ben Points 23834

Bien sûr...

select case substr(status,1,1) -- you're only interested in the first character.
            when 'a' then 'Active'
            when 'i' then 'Inactive'
            when 't' then 'Terminated'
       end as statustext
  from stage.tst

Cependant, il y a quelques points inquiétants dans ce schéma. Tout d'abord, si vous avez une colonne qui signifie quelque chose, ajouter un nombre à la fin n'est pas nécessairement la meilleure façon de procéder. De plus, en fonction du nombre de "statuts" que vous avez, vous pourriez envisager de transformer cette colonne en clé étrangère vers une table séparée.


D'après votre commentaire, vous voulez certainement transformer cette clé en clé étrangère. Par exemple

create table statuses ( -- Not a good table name :-)
    status varchar2(10)
  , description varchar2(10)
  , constraint pk_statuses primary key (status)
    )

create table tst (
    id number
  , status varchar2(10)
  , constraint pk_tst primary key (id)
  , constraint fk_tst foreign key (status) references statuses (status)
    )

Votre question devient alors

select a.status, b.description
  from tst a
  left outer join statuses b
    on a.status = b.status

Voici un Fiddle SQL à démontrer.

18voto

Sathya Points 9277

Vous pouvez le réécrire pour utiliser la condition ELSE d'un programme CASE :

SELECT status,
       CASE status
         WHEN 'i' THEN 'Inactive'
         WHEN 't' THEN 'Terminated'
         ELSE 'Active'
       END AS StatusText
FROM   stage.tst

7voto

Thunder Points 1747

Il sera plus facile de le faire en utilisant décoder .

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS

2voto

Alexei Martianov Points 405

Puisque la recherche sur Internet pour Oracle case en haut de ce lien, j'ajoute ici pour l'cas déclaration mais ne répond pas à la question posée sur le cas. expression :

CASE
   WHEN grade = 'A' THEN dbms_output.put_line('Excellent');
   WHEN grade = 'B' THEN dbms_output.put_line('Very Good');
   WHEN grade = 'C' THEN dbms_output.put_line('Good');
   WHEN grade = 'D' THEN dbms_output.put_line('Fair');
   WHEN grade = 'F' THEN dbms_output.put_line('Poor');
   ELSE dbms_output.put_line('No such grade');
END CASE;

ou une autre variante :

CASE grade
   WHEN 'A' THEN dbms_output.put_line('Excellent');
   WHEN 'B' THEN dbms_output.put_line('Very Good');
   WHEN 'C' THEN dbms_output.put_line('Good');
   WHEN 'D' THEN dbms_output.put_line('Fair');
   WHEN 'F' THEN dbms_output.put_line('Poor');
   ELSE dbms_output.put_line('No such grade');
END CASE;

Selon les documents d'Oracle : https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X