Gibt es eine "bessere" Möglichkeit, eine SELECT
Klausel umzuschreiben , bei der mehrere Spalten dieselben CASE WHEN
Bedingungen verwenden, sodass die Bedingungen nur einmal überprüft werden?
Siehe folgendes Beispiel.
SELECT
CASE testStatus
WHEN 'A' THEN 'Authorized'
WHEN 'C' THEN 'Completed'
WHEN 'P' THEN 'In Progress'
WHEN 'X' THEN 'Cancelled'
END AS Status,
CASE testStatus
WHEN 'A' THEN authTime
WHEN 'C' THEN cmplTime
WHEN 'P' THEN strtTime
WHEN 'X' THEN cancTime
END AS lastEventTime,
CASE testStatus
WHEN 'A' THEN authBy
WHEN 'C' THEN cmplBy
WHEN 'P' THEN strtBy
WHEN 'X' THEN cancBy
END AS lastEventUser
FROM test
In Nicht-SQL-Pseudocode könnte der Code folgendermaßen aussehen:
CASE testStatus
WHEN 'A'
StatusCol = 'Authorized'
lastEventTimeCol = authTime
lastEventUserCol = authUser
WHEN 'C'
StatusCol = 'Completed'
lastEventTimeCol = cmplTime
lastEventUserCol = cmplUser
...
END
Hinweis:
- Mir sind die offensichtlichen Normalisierungsprobleme bekannt, die mit der Abfrage verbunden sind. Ich wollte das Problem nur demonstrieren.
authTime
,authUser
,cmplTime
sind in der gleichen Tabelle?Antworten:
Sogar in Oracle (und tatsächlich im SQL-Standard)
CASE
gibt ein Ausdruck einen einzelnen Wert zurück. Es wird nicht wie in anderen Sprachen zur Steuerung des Durchflusses verwendet. Daher kann es nicht verwendet werden, um eine bedingte Entscheidung zwischen mehreren Spalten oder anderen Vorgängen zu treffen.Ich würde sagen, setzen Sie die längere Version des Codes (der bereits funktioniert) in eine Ansicht, und machen Sie sich darüber in Ihren formalen Abfragen keine Sorgen.
Sie können auch ein normaleres Design in Betracht ziehen. Warum speichern Sie beispielsweise die Überwachungsdetails nicht in einer separaten Tabelle, wobei Typ Teil des Schlüssels ist? Dies erleichtert die Pflege Ihres Codes erheblich, zumal weitere Typen hinzugefügt werden ...
quelle
Wenn alle diese Spalten aus derselben Tabelle stammen, können Sie Folgendes verwenden:
quelle