In diesem Oracle-Lernprogramm wird erläutert, wie Sie die Oracle/PLSQL DECODE-Funktion mit Syntax und Beispielen verwenden.
Beschreibung
Die Oracle/PLSQL DECODE-Funktion hat die Funktionalität einer IF-THEN-ELSE-Anweisung.
Syntax
Die Syntax für die DECODE-Funktion in Oracle/PLSQL lautet:
Parameter oder Argumente
expression Der zu vergleichende Wert Es wird vor dem Vergleich automatisch in den Datentyp des ersten Suchwerts konvertiert.
search Der Wert, der mit dem expression verglichen wird. Alle Suchwerte werden vor dem Vergleich automatisch in den Datentyp des ersten Suchwerts konvertiert.
result Der zurückgegebene Wert, wenn der expression der search entspricht.
default Wahlweise. Wenn keine Übereinstimmungen gefunden werden, gibt die DECODE-Funktion den Standardwert zurück. Wenn der Standardwert nicht angegeben wird, gibt die DECODE-Funktion NULL zurück (wenn keine Übereinstimmungen gefunden werden).
Notiz
- Die DECODE-Funktion gibt einen Wert zurück, der denselben Datentyp wie das erste Ergebnis in der Liste hat.
- Wenn das erste Ergebnis NULL ist, wird der Rückgabewert in VARCHAR2 konvertiert.
- Wenn das erste Ergebnis den Datentyp CHAR hat, wird der Rückgabewert in VARCHAR2 konvertiert.
- Wenn keine Übereinstimmungen gefunden werden, wird der Standardwert zurückgegeben.
- Wenn der Standardwert fehlt und keine Übereinstimmungen gefunden werden, wird NULL zurückgegeben.
Gilt für
Die DECODE-Funktion kann in folgenden Versionen von Oracle/PLSQL verwendet werden:
- Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i
Beispiel
Die DECODE-Funktion kann in Oracle/PLSQL verwendet werden.
Sie können die DECODE-Funktion in einer SQL-Anweisung wie folgt verwenden:
1 2 3 4 5 6 |
SELECT supplier_name, DECODE(supplier_id, 10000, 'IBM', 10001, 'Microsoft', 10002, 'Hewlett Packard', 'Gateway') result FROM suppliers; |
Die obige DECODE-Anweisung entspricht der folgenden IF-THEN-ELSE-Anweisung:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
IF supplier_id = 10000 THEN result := 'IBM'; ELSIF supplier_id = 10001 THEN result := 'Microsoft'; ELSIF supplier_id = 10002 THEN result := 'Hewlett Packard'; ELSE result := 'Gateway'; END IF; |
Die DECODE-Funktion vergleicht jeden supplier_id-Wert nacheinander.
Häufig gestellte Fragen
Frage:
Einer unserer Zuschauer wollte wissen, wie man die DECODE-Funktion benutzt, um zwei Daten zu vergleichen (zB: date1 und date2), wobei, wenn date1> date2, die DECODE-Funktion date2 zurückgeben soll. Andernfalls sollte die DECODE-Funktion date1 zurückgeben.
Antwort:
Verwenden Sie dazu die DECODE-Funktion wie folgt:
1 |
DECODE((date1 - date2) - ABS(date1 - date2), 0, date2, date1) |
Hilfreich Tip Nr. 1:
Einer unserer Viewer schlug vor, die SIGN-Funktion wie folgt mit der DECODE-Funktion zu kombinieren:
Das obige Datumsbeispiel könnte wie folgt geändert werden:
1 |
DECODE(SIGN(date1-date2), 1, date2, date1) |
Die SIGN/DECODE – Kombination ist auch hilfreich für numerische Vergleiche, Sales Bonuses
1 |
DECODE(SIGN(actual-target), -1, 'NO Bonus for you', 0,'Just made it', 1, 'Congrats, you are a winner') |
Hilfreich Tip Nr. 2:
Einer unserer Viewer schlug vor, die LEAST-Funktion (anstelle der DECODE-Funktion) wie folgt zu verwenden:
Das obige Datumsbeispiel könnte wie folgt geändert werden:
1 |
LEAST(date1, date2) |
Frage:
Ich würde gerne wissen, ob es möglich ist, die DECODE-Funktion für Zahlenbereiche zu verwenden, dh 1-10 = ‚category 1‘, 11-20 = ‚category 2‘, anstatt jede Zahl einzeln dekodieren zu müssen.
Antwort:
Leider können Sie die DECODE-Funktion nicht für Zahlenbereiche verwenden. Sie können jedoch versuchen, eine Formel zu erstellen, die für einen bestimmten Bereich eine Zahl und für den nächsten Bereich eine andere Zahl ergibt.
Beispielsweise:
1 2 3 4 5 6 |
SELECT supplier_id, DECODE(TRUNC ((supplier_id - 1) / 10), 0, 'category 1', 1, 'category 2', 2, 'category 3', 'unknown') result FROM suppliers; |
In diesem Beispiel basierend auf der Formel:
1 |
TRUNC ((supplier_id - 1) / 10 |
Die Formel wird auf 0 ausgewertet, wenn die supplier_id zwischen 1 und 10 liegt.
Die Formel wird mit 1 bewertet, wenn die supplier_id zwischen 11 und 20 liegt.
Die Formel wird zu 2 ausgewertet, wenn die supplier_id zwischen 21 und 30 liegt.
und so weiter…
Frage:
Ich muss eine DECODE-Anweisung schreiben, die folgendes zurückgibt:
Wenn yrs_of_service <1, dann geben Sie 0.04 zurück Wenn yrs_of_service> = 1 und <5, dann geben Sie 0.04 zurück Wenn yrs_of_service> 5, dann geben Sie 0.06 zurück
Wie kann ich das machen?
Antwort:
Sie müssen eine Formel erstellen, die für jeden Ihrer Bereiche eine einzige Zahl ergibt.
Beispielsweise:
1 2 3 4 5 |
SELECT emp_name, DECODE(TRUNC (( yrs_of_service + 3) / 4), 0, 0.04, 1, 0.04, 0.06) as perc_value FROM employees; |
Frage:
Gibt es eine Begrenzung für die Anzahl der Argumente, die Sie in einer DECODE-Anweisung haben können? Ich erhalte einen Fehler, „ORA-00939: too many arguments for function“.
Antwort:
Ja, die maximale Anzahl von Komponenten, die Sie in einer DECODE-Funktion haben können, ist 255. Dies schließt die Argumente für Ausdruck, Suche und Ergebnis ein.