Konvertierungsfunktionen verwenden

Neben den SQL-Dienstprogrammfunktionen enthält die in Oracle integrierte Funktionsbibliothek Typkonvertierungsfunktionen. Es kann Szenarien geben, in denen die Abfrage Eingaben in einem bestimmten Datentyp erwartet, diese jedoch in einem anderen Datentyp empfängt. In solchen Fällen versucht Oracle implizit, den unerwarteten Wert in einen kompatiblen Datentyp zu konvertieren, der ersetzt werden kann, und die Anwendungskontinuität wird nicht beeinträchtigt. Die Typkonvertierung kann entweder implizit von Oracle oder explizit vom Programmierer durchgeführt werden.

Die implizite Datentypkonvertierung basiert auf einer Matrix, die die Unterstützung von Oracle für das interne Typumwandeln zeigt. Neben diesen Regeln bietet Oracle Typkonvertierungsfunktionen an, die in den Abfragen zur expliziten Konvertierung und Formatierung verwendet werden können. In der Tat wird empfohlen, eine explizite Konvertierung durchzuführen, anstatt sich auf Software Intelligence zu verlassen. Die implizite Konvertierung funktioniert zwar gut, aber um die Verzerrungschancen zu beseitigen, bei denen es schwierig sein kann, fehlerhafte Eingaben intern zu typisieren.

Implizite Datentypkonvertierung

Ein VARCHAR2- oder CHAR-Wert kann von Oracle implizit in einen Wert vom Typ NUMBER oder DATE konvertiert werden. Ebenso kann ein Wert vom Typ NUMBER oder DATA vom Oracle-Server automatisch in Zeichendaten konvertiert werden. Beachten Sie, dass die implizite Umwandlung nur dann erfolgt, wenn das Zeichen eine gültige Zahl oder einen gültigen Datumswert darstellt.

Untersuchen Sie beispielsweise die folgenden SELECT-Abfragen. Beide Abfragen führen zu demselben Ergebnis, da Oracle 15000 und '15000' intern als gleich behandelt.

Abfrage-1

SELECT employee_id,first_name,salary
FROM employees
WHERE salary > 15000;

Abfrage-2

SELECT employee_id,first_name,salary
FROM employees
WHERE salary > '15000';

Explizite Datentypkonvertierung

SQL-Konvertierungsfunktionen sind Funktionen für einzelne Zeilen, mit denen Spaltenwerte, Literale oder Ausdrücke typisiert werden können. TO_CHAR, TO_NUMBER und TO_DATE sind die drei Funktionen, die eine Kreuzmodifikation von Datentypen durchführen.

TO_CHAR-Funktion

Die Funktion TO_CHAR wird verwendet, um eine numerische oder Datumseingabe in den Zeichentyp mit einem Formatmodell (optional) zu typisieren.

Syntax

TO_CHAR(number1, [format], [nls_parameter])

Für die Konvertierung von Zahlen in Zeichen können nls-Parameter verwendet werden, um Dezimalzeichen, Gruppentrennzeichen, lokales Währungsmodell oder internationales Währungsmodell anzugeben. Dies ist eine optionale Spezifikation. Wenn diese Option nicht verfügbar ist, werden die Einstellungen für die Sitzungsebene nls verwendet. Für die Konvertierung von Datum in Zeichen kann der Parameter nls verwendet werden, um die Tages- und Monatsnamen anzugeben.

Datumsangaben können nach der Konvertierung in Zeichentypen mit der Funktion TO_CHAR in mehreren Formaten formatiert werden. Mit der Funktion TO_CHAR werden Oracle 11g-Anzeigedaten in einem bestimmten Format angezeigt. Formatmodelle unterscheiden zwischen Groß- und Kleinschreibung und müssen in einfache Anführungszeichen gesetzt werden.

Betrachten Sie die folgende SELECT-Abfrage. Die Abfrage formatiert die Spalten HIRE_DATE und SALARY der Tabelle EMPLOYEES mithilfe der Funktion TO_CHAR.

SELECT first_name,
       TO_CHAR (hire_date, 'MONTH DD, YYYY') HIRE_DATE,
	   TO_CHAR (salary, '$99999.99') Salary
FROM employees
WHERE rownum < 5;

FIRST_NAME           HIRE_DATE          SALARY
-------------------- ------------------ ----------
Steven               JUNE      17, 2003  $24000.00
Neena                SEPTEMBER 21, 2005  $17000.00
Lex                  JANUARY   13, 2001  $17000.00
Alexander            JANUARY   03, 2006   $9000.00

Mit dem ersten TO_CHAR wird das Mietdatum in das Datumsformat MONTH TT, JJJJ konvertiert, dh Monat, der mit Leerzeichen geschrieben und aufgefüllt ist, gefolgt vom zweistelligen Tag des Monats und dem vierstelligen Jahr. Wenn Sie den Monatsnamen lieber in gemischter Groß- / Kleinschreibung anzeigen möchten (dh "Dezember"), verwenden Sie diese Groß- / Kleinschreibung einfach im Formatargument: ('Monat TT, JJJJ').

Die zweite TO_CHAR-Funktion in Abbildung 10-39 wird zum Formatieren des GEHALTS verwendet, um das Währungszeichen und zwei Dezimalstellen anzuzeigen.

Oracle bietet umfassende Formatmodelle. Die folgende Tabelle zeigt die Liste der Formatmodelle, mit denen Datums- und Zahlenwerte mit TO_CHAR als Zeichen eingegeben werden können.

Modell formatieren Beschreibung
,(Komma) Es wird ein Komma an der angegebenen Position zurückgegeben. Sie können mehrere Kommas in einem Zahlenformatmodell angeben. Einschränkungen: Ein Kommaelement kann kein Zahlenformatmodell beginnen. Ein Komma kann in einem Zahlenformatmodell nicht rechts von einem Dezimalzeichen oder Punkt stehen.
.(Zeitraum) Gibt einen Dezimalpunkt zurück, der ein Punkt (.) An der angegebenen Position ist. Einschränkung: Sie können in einem Zahlenformatmodell nur einen Punkt angeben
$ Gibt den Wert mit einem führenden Dollarzeichen zurück
0 Gibt führende Nullen zurück. Gibt nachgestellte Nullen zurück.
9 Gibt einen Wert mit der angegebenen Anzahl von Ziffern mit einem führenden Leerzeichen (positiv) oder einem führenden Minuszeichen (negativ) zurück. Führende Nullen sind leer, mit Ausnahme eines Nullwerts, der eine Null für den ganzzahligen Teil der Festkommazahl zurückgibt.
B. Gibt Leerzeichen für den ganzzahligen Teil einer Festkommazahl zurück, wenn der ganzzahlige Teil Null ist (unabhängig von "0" im Formatmodell).
C. Gibt an der angegebenen Position das ISO-Währungssymbol zurück (den aktuellen Wert des Parameters NLS_ISO_CURRENCY).
D. Gibt an der angegebenen Position das Dezimalzeichen zurück, das der aktuelle Wert des Parameters NLS_NUMERIC_CHARACTER ist. Der Standardwert ist ein Punkt (.). Einschränkung: Sie können in einem Zahlenformatmodell nur ein Dezimalzeichen angeben.
EEE Gibt einen Wert in wissenschaftlicher Notation zurück.
FM Gibt einen Wert ohne führende oder nachfolgende Leerzeichen zurück.
G Gibt an der angegebenen Position das Gruppentrennzeichen zurück (den aktuellen Wert des Parameters NLS_NUMERIC_CHARACTER). Sie können mehrere Gruppentrennzeichen in einem Zahlenformatmodell angeben. Einschränkung: Ein Gruppentrennzeichen kann in einem Zahlenformatmodell nicht rechts von einem Dezimalzeichen oder Punkt stehen
L. Gibt an der angegebenen Position das Symbol der lokalen Währung zurück (den aktuellen Wert des Parameters NLS_CURRENCY).
MI Gibt einen negativen Wert mit einem nachgestellten Minuszeichen (-) zurück. Gibt einen positiven Wert mit einem nachgestellten Leerzeichen zurück. Einschränkung: Das MI-Formatelement kann nur an der letzten Position eines Zahlenformatmodells angezeigt werden.
PR Gibt einen negativen Wert in zurück. Es kann nur am Ende eines Zahlenformatmodells erscheinen.
RN, rm Gibt einen Wert als römische Ziffer in Großbuchstaben zurück. Gibt einen Wert als römische Ziffer in Kleinbuchstaben zurück. Der Wert kann eine Ganzzahl zwischen 1 und 3999 sein.
S. Gibt einen negativen Wert mit einem führenden oder nachfolgenden Minuszeichen (-) zurück. Gibt einen positiven Wert mit einem führenden oder nachfolgenden Pluszeichen (+) zurück. Einschränkung: Das S-Format-Element kann nur an der ersten oder letzten Position eines Zahlenformatmodells angezeigt werden.
TM "Text Minimum". Gibt (in Dezimalausgabe) die kleinstmögliche Anzahl von Zeichen zurück. Bei diesem Element wird die Groß- und Kleinschreibung nicht berücksichtigt.
U. Gibt an der angegebenen Position das Doppelwährungssymbol "Euro" (oder ein anderes) zurück (den aktuellen Wert des Parameters NLS_DUAL_CURRENCY).
V. Gibt einen mit 10n multiplizierten Wert zurück (und runden Sie ihn gegebenenfalls auf), wobei n die Anzahl der 9en nach dem "V" ist.
X. Gibt den Hexadezimalwert der angegebenen Anzahl von Ziffern zurück.

TO_NUMBER Funktion

Die Funktion TO_NUMBER konvertiert einen Zeichenwert in einen numerischen Datentyp. Wenn die zu konvertierende Zeichenfolge nicht numerische Zeichen enthält, gibt die Funktion einen Fehler zurück.

Syntax

TO_NUMBER (string1, [format], [nls_parameter])

Die folgende Tabelle zeigt die Liste der Formatmodelle, mit denen Zeichenwerte mit TO_NUMBER als Zahl eingegeben werden können.

Modell formatieren Beschreibung
CC Jahrhundert
SCC Jahrhundert v. Chr. Mit dem Präfix -
JJJJ Jahr mit 4 Zahlen
SYYY Jahr BC mit dem Präfix -
IYYY ISO-Jahr mit 4 Zahlen
YY Jahr mit 2 Zahlen
RR Jahr mit 2 Zahlen mit Y2k-Kompatibilität
JAHR Jahr in Zeichen
SYEAR Jahr in Zeichen, BC mit dem Präfix -
BC BC / AD-Anzeige
Q. Viertel in Zahlen (1,2,3,4)
MM Monat des Jahres 01, 02 ... 12
MONAT Monat in Zeichen (dh Januar)
MON JAN, FEB
WW Wochennummer (dh 1)
W. Wochennummer des Monats (dh 5)
IW Wochennummer des Jahres in ISO-Norm.
DDD Tag des Jahres in Zahlen (dh 365)
DD Tag des Monats in Zahlen (dh 28)
D. Wochentag in Zahlen (dh 7)
TAG Wochentag in Zeichen (dh Montag)
FMDAY Wochentag in Zeichen (dh Montag)
DY Wochentag in kurzer Charakterbeschreibung (dh SUN)
J. Julianischer Tag (Anzahl der Tage seit dem 1. Januar 4713 v. Chr., Wobei der 1. Januar 4713 v. Chr. 1 in Oracle ist)
HH, H12 Stundennummer des Tages (1-12)
HH24 Stundennummer des Tages mit 24-Stunden-Notation (0-23)
AM, PM Vormittags oder nachmittags
FRÄULEIN Anzahl der Minuten und Sekunden (dh 59),
SSSSS Anzahl der Sekunden an diesem Tag.
DS Kurzes Datumsformat. Hängt von den NLS-Einstellungen ab. Nur mit Zeitstempel verwenden.
DL Langes Datumsformat. Hängt von den NLS-Einstellungen ab. Nur mit Zeitstempel verwenden.
E. Kurzname der Ära. Gültig nur für Kalender: Japanese Imperial, ROC Official, Thai Buddha.
EE Der vollständige Name der Ära
FF Die Sekundenbruchteile. Verwendung mit Zeitstempel.
FF1..FF9 Die Sekundenbruchteile. Verwendung mit Zeitstempel. Die Ziffer steuert die Anzahl der Dezimalstellen, die für Sekundenbruchteile verwendet werden.
FM Füllmodus: Unterdrückt Leerzeichen in der Ausgabe der Konvertierung
FX Format Exact: Erfordert eine genaue Musterübereinstimmung zwischen Daten und Formatmodell.
IYY ODER IY ODER I. Die letzten 3,2,1 Ziffern des ISO-Standardjahres. Nur Ausgabe
RM Die römische Zahlendarstellung des Monats (I .. XII)
RR Die letzten 2 Ziffern des Jahres.
RRRR Die letzten 2 Ziffern des Jahres, wenn sie für die Ausgabe verwendet werden. Akzeptiert fünfstellige Jahre, wenn sie für die Eingabe verwendet werden.
SP Dinkelformat. Kann am Ende eines Zahlenelements erscheinen. Das Ergebnis ist immer in Englisch. Zum Beispiel gibt Monat 10 im Format MMSP "zehn" zurück.
SPTH Dinkel- und Ordnungsformat; 1 ergibt zuerst.
TH Konvertiert eine Zahl in ihr Ordnungsformat. Zum Beispiel wird 1 der 1 ..
TS Kurzzeitformat. Hängt von den NLS-Einstellungen ab. Nur mit Zeitstempel verwenden.
TZD Kurzname der Zeitzone. dh PST.
TZH, TZM Zeitzone Stunde / Minute Verschiebung.
TZR Zeitzonenbereich
X. Lokales Radix-Zeichen. In Amerika ist dies eine Periode (.)

Die folgenden SELECT-Abfragen akzeptieren Zahlen als Zeicheneingaben und drucken sie gemäß dem Formatbezeichner.

SELECT  TO_NUMBER('121.23', '9G999D99') 
FROM DUAL

TO_NUMBER('121.23','9G999D99')
------------------------------
                        121.23

SELECT  TO_NUMBER('1210.73', '9999.99') 
FROM DUAL;

TO_NUMBER('1210.73','9999.99')
------------------------------
                       1210.73

TO_DATE-Funktion

Die Funktion verwendet Zeichenwerte als Eingabe und gibt ein formatiertes Datumsäquivalent zurück. Mit der Funktion TO_DATE können Benutzer ein Datum in einem beliebigen Format eingeben und anschließend den Eintrag in das von Oracle 11g verwendete Standardformat konvertieren.

Syntax:

TO_DATE( string1, [ format_mask ], [ nls_language ] )

Ein format_mask-Argument besteht aus einer Reihe von Elementen, die genau darstellen, wie die Daten aussehen sollen, und in einfache Anführungszeichen gesetzt werden müssen.

Modell formatieren Beschreibung
JAHR Jahr, buchstabiert
JJJJ 4-stelliges Jahr
JJJ, JJ, Y. Letzte 3, 2 oder 1 Ziffer (n) des Jahres.
IYY, IY, ich Letzte 3, 2 oder 1 Ziffer (n) des ISO-Jahres.
IYYY 4-stelliges Jahr basierend auf der ISO-Norm
RRRR Akzeptiert ein zweistelliges Jahr und gibt ein vierstelliges Jahr zurück.
Q. Quartal des Jahres (1, 2, 3, 4; JAN-MAR = 1).
MM Monat (01-12; JAN = 01).
MON Kurzname des Monats.
MONAT Name des Monats, mit Leerzeichen auf eine Länge von 9 Zeichen aufgefüllt.
RM Monat mit römischer Zahl (I-XII; JAN = I).
WW Woche des Jahres (1-53), wobei Woche 1 am ersten Tag des Jahres beginnt und bis zum siebten Tag des Jahres andauert.
W. Woche des Monats (1-5), wobei Woche 1 am ersten Tag des Monats beginnt und am siebten endet.
IW Woche des Jahres (1-52 oder 1-53) basierend auf der ISO-Norm.
D. Wochentag (1-7).
TAG Name des Tages.
DD Tag des Monats (1-31).
DDD Tag des Jahres (1-366).
DY Kurzname des Tages.
J. Julianischer Tag; die Anzahl der Tage seit dem 1. Januar 4712 v.
HH12 Stunde des Tages (1-12).
HH24 Stunde des Tages (0-23).
FRÄULEIN Minute (0-59).
SSSSS Sekunden nach Mitternacht (0-86399).
FF Bruchteil von Sekunden. Verwenden Sie nach FF einen Wert von 1 bis 9, um die Anzahl der Stellen in Sekundenbruchteilen anzugeben. Zum Beispiel 'FF4'.
AM, PM Meridiananzeige
AD, BC AD, BC Anzeige
TZD Informationen zur Sommerzeit. Zum Beispiel 'PST'
TZH, TZM, TZR Zeitzone Stunde / Minute / Region.

Im folgenden Beispiel wird eine Zeichenfolge in ein Datum konvertiert:

SELECT TO_DATE('January 15, 1989, 11:00 A.M.',  'Month dd, YYYY, HH:MI A.M.',  'NLS_DATE_LANGUAGE = American')
FROM DUAL;

TO_DATE('
---------
15-JAN-89

Allgemeine Funktionen

Allgemeine Funktionen werden verwendet, um NULL-Werte in der Datenbank zu verarbeiten. Das Ziel der allgemeinen NULL-Handhabungsfunktionen besteht darin, die NULL-Werte durch einen alternativen Wert zu ersetzen. Wir werden diese Funktionen im Folgenden kurz durchgehen.

NVL

Die NVL-Funktion ersetzt einen NULL-Wert durch einen alternativen Wert.

Syntax:

NVL( Arg1, replace_with )

In der Syntax sind beide Parameter obligatorisch. Beachten Sie, dass die NVL-Funktion mit allen Arten von Datentypen funktioniert. Und auch, dass der Datentyp der ursprünglichen Zeichenfolge und der Ersatz in einem kompatiblen Zustand sein müssen, dh entweder gleich oder implizit von Oracle konvertierbar.

Wenn arg1 ein Zeichenwert ist, konvertiert oracle die Ersatzzeichenfolge vor dem Vergleich in den mit arg1 kompatiblen Datentyp und gibt VARCHAR2 im Zeichensatz von expr1 zurück. Wenn arg1 numerisch ist, bestimmt Oracle das Argument mit der höchsten numerischen Priorität, konvertiert das andere Argument implizit in diesen Datentyp und gibt diesen Datentyp zurück.

Die folgende SELECT-Anweisung zeigt 'n / a' an, wenn einem Mitarbeiter noch kein Job zugewiesen wurde, dh JOB_ID ist NULL. Andernfalls wird der tatsächliche JOB_ID-Wert angezeigt.

SELECT  first_name, NVL(JOB_ID, 'n/a')
FROM employees;

NVL2

Als Erweiterung gegenüber NVL hat Oracle eine Funktion eingeführt, mit der nicht nur NULL-Spaltenwerte, sondern auch NICHT NULL-Spalten durch Werte ersetzt werden können. Die NVL2-Funktion kann verwendet werden, um einen alternativen Wert für einen NULL-Wert sowie einen Nicht-NULL-Wert zu ersetzen.

Syntax:

NVL2( string1, value_if_NOT_null, value_if_null )

Die folgende SELECT-Anweisung würde 'Bench' anzeigen, wenn JOB_CODE für einen Mitarbeiter NULL ist. Für einen bestimmten Wert von JOB CODE, der nicht null ist, wird der konstante Wert 'Job Assigned' angezeigt.

SQL> SELECT NVL2(JOB_CODE, 'Job Assigned', 'Bench')
FROM employees;

NULLIF

Die NULLIF-Funktion vergleicht zwei Argumente expr1 und expr2. Wenn expr1 und expr2 gleich sind, wird NULL zurückgegeben. Andernfalls wird expr1 zurückgegeben. Im Gegensatz zur anderen Nullbehandlungsfunktion kann das erste Argument nicht NULL sein.

Syntax:

NULLIF (expr1, expr2)

Beachten Sie, dass das erste Argument ein Ausdruck sein kann, der als NULL ausgewertet wird, aber nicht das Literal NULL. Beide Parameter sind für die Ausführung der Funktion obligatorisch.

Die folgende Abfrage gibt NULL zurück, da beide Eingabewerte 12 gleich sind.

SELECT	NULLIF (12, 12)
FROM DUAL;

In ähnlicher Weise wird unter der Abfrage 'SUN' zurückgegeben, da beide Zeichenfolgen nicht gleich sind.

SELECT NULLIF ('SUN', 'MOON')
FROM DUAL;

VERSCHMELZEN

Die COALESCE-Funktion, eine allgemeinere Form von NVL, gibt den ersten Nicht-Null-Ausdruck in der Argumentliste zurück. Es werden mindestens zwei obligatorische Parameter benötigt, aber die maximale Anzahl von Argumenten ist unbegrenzt.

Syntax:

COALESCE (expr1, expr2, ... expr_n )

Betrachten Sie die folgende SELECT-Abfrage. Es wählt den ersten Wert ungleich Null aus, der in Adressfelder für einen Mitarbeiter eingegeben wird.

SELECT COALESCE (address1, address2, address3) Address
FROM  employees;

Interessanterweise ähnelt die Funktion der COALESCE-Funktion dem Konstrukt IF..ELSIF..ENDIF. Die obige Abfrage kann wie folgt umgeschrieben werden:

IF address1 is not null THEN
   result := address1;
ELSIF address2 is not null THEN
   result := address2;
ELSIF address3 is not null THEN
   result := address3;
ELSE
   result := null;
END IF;

Bedingte Funktionen

Oracle bietet bedingte Funktionen DECODE und CASE, um auch in SQL-Anweisungen Bedingungen aufzuerlegen.

Die DECODE-Funktion

Die Funktion ist die SQL-Äquivalenz der bedingten prozeduralen Anweisung IF..THEN..ELSE. DECODE arbeitet mit Werten / Spalten / Ausdrücken aller Datentypen.

Syntax:

DECODE (expression, search, result [, search, result]... [, default])

Die DECODE-Funktion vergleicht den Ausdruck nacheinander mit jedem Suchwert. Wenn zwischen Ausdruck und Suchargument Gleichheit besteht, wird das entsprechende Ergebnis zurückgegeben. Falls keine Übereinstimmung vorliegt, wird der Standardwert zurückgegeben, falls definiert, andernfalls NULL. Im Falle einer Fehlanpassung der Typkompatibilität führt Oracle intern eine implizite Konvertierung durch, um die Ergebnisse zurückzugeben.

Tatsächlich betrachtet Oracle zwei Nullen als gleichwertig, wenn mit der DECODE-Funktion gearbeitet wird.

SELECT DECODE(NULL,NULL,'EQUAL','NOT EQUAL') 
FROM DUAL;

DECOD
-----
EQUAL

Wenn expression null ist, gibt Oracle das Ergebnis der ersten Suche zurück, das ebenfalls null ist. Die maximale Anzahl von Komponenten in der DECODE-Funktion beträgt 255.

SELECT	first_name, salary, DECODE (hire_date, sysdate,'NEW JOINEE','EMPLOYEE')
	FROM employees;

CASE-Ausdruck

CASE-Ausdrücke funktionieren nach dem gleichen Konzept wie DECODE, unterscheiden sich jedoch in Syntax und Verwendung.

Syntax:

CASE  [ expression ]
   WHEN condition_1 THEN result_1
   WHEN condition_2 THEN result_2
   ...
   WHEN condition_n THEN result_n
   ELSE result
END

Die Oracle-Suche beginnt von links und bewegt sich nach rechts, bis eine echte Bedingung gefunden wird, und gibt dann den damit verbundenen Ergebnisausdruck zurück. Wenn keine Bedingung als wahr befunden wird und eine ELSE-Klausel vorhanden ist, gibt Oracle das mit else definierte Ergebnis zurück. Andernfalls gibt Oracle null zurück.

Die maximale Anzahl von Argumenten in einem CASE-Ausdruck beträgt 255. Alle Ausdrücke zählen zu dieser Grenze, einschließlich des Anfangsausdrucks eines einfachen CASE-Ausdrucks und des optionalen ELSE-Ausdrucks. Jedes WHEN ... THEN-Paar zählt als zwei Argumente. Um dieses Überschreiten zu vermeiden, können Sie CASE-Ausdrücke so verschachteln, dass return_expr selbst ein CASE-Ausdruck ist.

SELECT first_name, CASE	WHEN salary < 200 THEN 'GRADE 1'
			WHEN salary > 200 AND salary < 5000 THEN 'GRADE 2'
			ELSE 'GRADE 3'
		   END CASE
FROM employees;	

ENAM  	CASE
----    -------
JOHN    GRADE 2
EDWIN   GRADE 3
KING    GRADE 1