it-swarm.com.de

CASE .. WHEN-Ausdruck in Oracle SQL

Ich habe die Tabelle mit 1 Spalte und habe folgende Daten

Status
a1
i
t
a2
a3

Ich möchte das folgende Ergebnis in meiner Auswahlabfrage anzeigen

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

Eine Möglichkeit, die ich mir vorstellen konnte, war die Verwendung eines Switch When-Ausdrucks in der Auswahlabfrage

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

Gibt es eine andere Möglichkeit, bei der ich nicht schreiben muss? Beim Ausdruck 3-mal für Active Status  und der gesamte aktive Status kann in einem einzigen Ausdruck überprüft werden?

62
Nilesh Barai

Sie können eine IN-Klausel verwenden

So etwas wie

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

Schauen Sie sich diese Demo an

SQL Fiddle DEMO

102
Adriaan Stander

Na sicher...

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

Es gibt jedoch einige besorgniserregende Dinge über dieses Schema. Erstens, wenn Sie eine Spalte haben, die etwas bedeutet, und eine Zahl an das Ende anhängen, ist dies nicht unbedingt der beste Weg. Abhängig von der Anzahl der Status, die Sie haben, möchten Sie möglicherweise erwägen, diese Spalte in einen Fremdschlüssel in eine separate Tabelle umzuwandeln.


Aufgrund Ihres Kommentars möchten Sie dies definitiv in einen Fremdschlüssel umwandeln. Zum Beispiel

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)
    )

Ihre Anfrage wird dann

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

Hier ist ein SQL Fiddle , um dies zu demonstrieren.

15
Ben

Sie können es umschreiben, um die ELSE-Bedingung einer CASE zu verwenden:

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

Die Verwendung von decode ist einfacher.

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

Da die Websuche nach Oracle case an erster Stelle zu diesem Link steht, füge ich hier die case -Anweisung hinzu, ohne jedoch die Frage zu case zu beantworten :

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;

oder eine andere 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;

Für Oracle-Dokumente: https://docs.Oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm

1
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

Folgende Syntax würde funktionieren:

....
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

Sie können nur das erste Zeichen des Status prüfen. Dafür verwenden Sie die Teilzeichenfolge. 

substr (status, 1,1)

In deinem Fall vorbei. 

0
Timo Hahn