Ich habe die Tabelle mit 1 Spalte und hat 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 könnte, war die Verwendung eines Switch When-Ausdrucks in einer ausgewählten Abfrage
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, dies zu tun, wenn ich nicht schreiben muss, wenn der Ausdruck dreimal für den aktiven Status und der gesamte aktive Status in einem einzigen Ausdruck überprüft werden können?
ELSE status
vorher hinzufügenEND
, wenn sich ein neuer Status einschleicht, erhalten Sie den Basisstatuswert anstelle einer Null fürSTATUSTEXT
. Ich würde nicht standardmäßig,ELSE 'active'
falls ein neuer inaktiver oder gekündigter Status von anderen eingeführt wird. Die Standardeinstellung "Aktiv" ist problematisch.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 an diesem Schema. Erstens, wenn Sie eine Spalte haben, die etwas bedeutet, und eine Zahl am Ende anhängen, ist dies nicht unbedingt der beste Weg. Abhängig von der Anzahl der Status, die Sie haben, sollten Sie diese Spalte möglicherweise in einen Fremdschlüssel für eine separate Tabelle umwandeln.
Basierend auf Ihrem Kommentar möchten Sie dies definitiv in einen Fremdschlüssel verwandeln. 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 eine SQL-Geige zur Demonstration.
quelle
Sie können es umschreiben, um die ELSE-Bedingung von a zu verwenden
CASE
:SELECT status, CASE status WHEN 'i' THEN 'Inactive' WHEN 't' THEN 'Terminated' ELSE 'Active' END AS StatusText FROM stage.tst
quelle
Die Dekodierung ist einfacher .
SELECT status, decode ( status, 'a1','Active', 'a2','Active', 'a3','Active', 'i','Inactive', 't','Terminated', 'Default')STATUSTEXT FROM STATUS
quelle
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;
quelle
Da die Websuche nach
Oracle case
Spitzen zu diesem Link sucht , füge ich hier eine Fallerklärung hinzu , beantworte jedoch nicht die Frage nach dem Fallausdruck :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;
Gemäß Oracle-Dokumenten: https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm
quelle
when
2. Variante wie zu schreibencase grade when 1,2 then
. Wenn Sie etwas anderes wissen, kommentieren Sie bitte.Sie können nur das erste Zeichen des Status überprüfen. Hierfür verwenden Sie die Teilzeichenfolgenfunktion.
substr (Status, 1,1)
In deinem Fall vorbei.
quelle
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 )
quelle
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
quelle