web-dev-qa-db-fra.com

CASE .. WHEN expression dans Oracle SQL

J'ai la table avec 1 colonne et a les données suivantes

Status
a1
i
t
a2
a3

Je veux afficher le résultat suivant dans ma requête sélectionnée

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

Une façon dont je pouvais penser consistait à utiliser une expression Switch When dans une requête select

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 besoin d'écrire Lorsque l'expression 3 fois pour l'état actif  et tout le statut actif peut être vérifié en une seule expression?

62
Nilesh Barai

Vous pouvez utiliser une clause IN

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

Regardez cette démo

SQL Fiddle DEMO

102
Adriaan Stander

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 inquiétudes à propos de ce schéma. Premièrement, si vous avez une colonne qui signifie quelque chose, l’ajout d’un numéro à la fin n’est pas nécessairement la meilleure solution. En outre, en fonction du nombre de statuts que vous avez, vous pouvez envisager de transformer cette colonne en une clé étrangère en une table séparée.


Sur la base de votre commentaire, vous voulez absolument transformer cela en une 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 requête devient alors

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

Voici un SQL Fiddle à démontrer.

15
Ben

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

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

Ce sera plus facile à faire avec decode .

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS
4
Thunder
SELECT
  STATUS,
  CASE
    WHEN STATUS IN('a1','a2','a3') 
     THEN 'Active'
    WHEN STATUS = 'i' 
     THEN 'Inactive'
    WHEN STATUS = 't'
     THEN 'Terminated'  ELSE null
  END AS STATUSTEXT
FROM
  stage.tst;
1
praveen kumar

Étant donné que la recherche sur le Web pour Oracle case en tête de ce lien, j’ajoute ici une instruction case , mais ne répond pas à la question posée à propos de la casse 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 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 la documentation Oracle: https://docs.Oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm

1
Alexei Martianov
CASE TO_CHAR(META.RHCONTRATOSFOLHA.CONTRATO)
WHEN '91' AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = '0001' THEN '91RJ'
WHEN '91' AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = '0002' THEN '91SP'
END CONTRATO,

00905. 00000 -  "missing keyword"
*Cause:    
*Action:
Erro na linha: 15 Coluna: 11
0
Vitor

La syntaxe suivante fonctionnerait:

....
where x.p_NBR =to_number(substr(y.k_str,11,5))
and x.q_nbr = 
 (case 
 when instr(substr(y.m_str,11,9),'_') = 6   then  to_number(substr(y.m_str,11,5))
 when instr(substr(y.m_str,11,9),'_') = 0   then  to_number(substr(y.m_str,11,9))
  else 
       1
  end
)
0
Smart Coder

Vous pouvez uniquement vérifier le premier caractère du statut. Pour cela, vous utilisez la fonction de sous-chaîne. 

substr (status, 1,1)

Dans ton cas passé. 

0
Timo Hahn