Zeichenkettenfunktionen können nicht nur zwischen SELECT und FROM benutzt werden, sondern auch im WHERE-Ausdruck. Im folgenden sehen wir uns drei Zeichenkettenfunktionen bezugnehmend auf Groß- und Kleinschreibung an.
select lower(ename) as Nachname from emp; NACHNAME -------- smith allen ward ...Diese Abfrage gibt als Ergebnismenge die Nachnamen (ename) der Mitarbeiter in Kleinbuchstaben zurück
select upper(ename) as Nachname from emp; NACHNAME -------- SMITH ALLEN WARD ...Diese Abfrage gibt als Ergebnismenge die Nachnamen (ename) der Mitarbeiter in Großbuchstaben zurück.
select initcap(ename) as Nachname from emp; NACHNAME -------- Smith Allen Ward ...Diese Abfrage gibt als Ergebnismenge die Nachnamen (ename) der Mitarbeiter zurück. Der erste Buchstabe wird groß geschrieben und alle weiteren werden klein geschrieben.
Zusammenfassung
select concat(ename,job) as Nachname from emp; NACHNAME -------------- SMITHCLERK ALLENSALESMAN WARDSALESMAN ...Es werden die Spalten Nachname (ename) und Job verknüpft. Dies entspricht dem Verknüpfungsoperator ||, wobei concat() aber nur 2 Argumente verarbeiten kann.
select ename as Nachname, substr(ename,1,3) from emp; NACHNAME SUB ----------------- SMITH SMI ALLEN ALL WARD WAR ...Diese Abfrage gibt eine Zeichenkette von 3 Zeichen, beginnend beim ersten Zeichen, zurück.
select ename as Nachname, substr(ename,3,2) from emp; NACHNAME SU ------------- SMITH IT ALLEN LE WARD RD ...Diese Abfrage gibt eine Zeichenkette von 2 Zeichen, beginnend beim dritten Zeichen, zurück.
select ename as Nachname, substr(ename,-3,2) from emp; NACHNAME SU ------------- SMITH IT ALLEN LE WARD AR ...Diese Abfrage gibt eine Zeichenkette von 2 Zeichen, beginnend beim dritten Zeichen von hinten, zurück.
select ename as Nachname, instr(ename,'S') from emp; NACHNAME INSTR(ENAME,'S') --------------------------- SMITH 1 ALLEN 0 WARD 0 ...Es wird in der Spalte Nachname (ename) nach dem Vorkommen von 'S' gesucht und die Position zurückgegeben. Wird ,S' nicht gefunden, so wird eine 0 zurückgegeben.
select ename as Nachname, length(ename) as Länge from emp; NACHNAME LÄNGE ---------------- SMITH 5 ALLEN 5 WARD 4 ...Es wird die Länge der Spalte Nachname (ename) zurückgegeben.
SELECT productname, length(productname) AS Laenge FROM products; PRODUCTNAME LAENGE ------------------- Milch 20 Käse 20 ...Es wird die Länge der Daten in der Spalte productname ermittelt. Da der Datentyp der Spalte productname aber CHAR ist, wird der verbleibende Platz bis zur bei CHAR angegebenen Länge mit Leerzeichen aufgefüllt. LENGTH gibt bei CHAR also immer die gleiche Länge aus, nämlich den Wert, der bei CHAR angegeben wurde.
select trim(' ' from ' Tech ') from dual;
Es werden die vorangestellten und nachfolgenden Leerzeichen entfernt.
SELECT productname,length(trim (' ' from productname) AS Laenge
FROM products;
PRODUCTNAME LAENGE
------------------------
Milch 5
Käse 4
...
Es wird die Länge der Daten in der Spalte productname ermittelt.
TRIM schneidet diese Leerzeichen ab.
Es wird demnach als Ergebnis die echte Länge angegeben.
select ltrim(' Tech') from dual;
Es werden die vorangestellten Leerzeichen entfernt.
select rtrim('Tech ') from dual;
Es werden die angefügten Leerzeichen entfernt.
select rpad('Tech',10,'*') from dual;
Es werden bis zur Gesamtlänge von 10 Zeichen mit * rechts aufgefüllt.
select lpad('Tech',10,'*') from dual;
Es werden bis zur Gesamtlänge von 10 Zeichen mit * links aufgefüllt.
replace(s1,s2[,s3])Suche s2 in s1 und ersetze ihn durch s3. Ist s3 nicht angegeben, wird s2 in s1 entfernt.
select replace('SCHADE', 'D', 'LK') from dual;
'SCHALKE'.
translate(s1,s2,s3)In s1 werden alle Zeichen aus s2 durch solche aus s3 ersetzt.
select translate('ABC67LR5', '0123456789','**********') from dual;
'ABC**LR*'
select translate('ABC67LR5', '*0123456789','*') from dual;
'ABCLR'.
select chr(65) from dual; 'A'
select ascii('A') from dual;
65
| Format | Beschreibung | Beispiel | |
|---|---|---|---|
| 999999 | 5 Stellen | 1234 | |
| 099999 | Auffüllen mit Nullen | 001234 |
| 9 | Stellvertreter für eine Ziffer (keine führenden Nullen) | |
| 0 | Stellvertreter für eine Ziffer (Führende Nullen) | |
| D | Dezimaltrennzeichen | |
| G | Tausenedertrennzeichen | |
| L | Position des Währungssymbols, NLS_CURRENCY |
| DD | zweistelliger Tageswert | |
| DAY | ausgeschriebener Tag | |
| MM | zweistelliger Monatswert | |
| Month | ausgeschriebener Monat | |
| YY | zweistelliger Jahreswert | |
| YYYY | vierstelliger Jahreswert |
select ename as "Nachname", to_char(sal,'09999') as Gehalt from emp; Nachname GEHALT ----------------- SMITH 00800 ALLEN 01600 ...Es wird das Gehalt der Angestellten in eine Zeichenkette konvertiert und mit 5 Stellen angegeben. Falls das Gehalt nicht 5 Stellen beträgt, so wird es mit führenden Nullen aufgefüllt. Dies ist zum Beispiel bei der PLZ in Deutschland sinnvoll.
select ename as "Nachname", to_char(sal,'09G999D00') as Gehalt from emp;Es wird das Gehalt der Angestellten in eine Zeichenkette konvertiert und mit 5 Stellen vor dem Komma (mit Tausender-Trennzeichnen) und zwei Stellen nach dem Dezimalzeichen ausgegeben.
select ename as "Nachname",
to_char(hiredate,'Day, "dem" dd. Month yyyy') as "Eingestellt am"
from emp
;
Nachname Eingestellt am
--------------------------------------------
SMITH Mittwoch , dem 17. Dezember 1980
ALLEN Freitag , dem 20. Februar 1981
...
Es wird das Einstellungsdatum der Angestellten in eine Zeichenkette konvertiert und im Format 'Day, " dem " dd. Month yyyy' ausgegeben.
select to_number(' 1,5') as Zahl from dual;
ZAHL
-----
1,5
Die Zeichenkette ' 1,5' wird in eine Zahl konvertiert.
select to_date('01.01.2001','dd.mm.yyyy') as Datum from dual;
DATUM
--------
01.01.01
Die Zeichenkette '01.01.2001' wird gemäß des Formates 'dd.mm.yyyy' als Datum interpretiert und in ein Datum konvertiert.
select nvl(comm,0) as "Kein NULL mehr" from emp;
Kein NULL mehr
--------------
0
300
500
...
Es wird in der Spalte comm nach NULL gesucht und durch eine 0 bei der Ausgabe ersetzt.
nvl2(s1,s2,s2)
select comm,nvl2(comm,'Komm','Keine Komm') from scott.emp;
select ename as Nachname,
job,
sal as "Altes Gehalt",
decode (job,'CLERK',sal*0.9,'SALESMAN',sal*0.8,sal) as "Gekürztes Gehalt"
from emp
;
NACHNAME JOB Altes Gehalt Gekürztes Gehalt
-------------------------------------------------
SMITH CLERK 800 720
ALLEN SALESMAN 1600 1280
WARD SALESMAN 1250 1000
JONES MANAGER 2975 2975
...
Es wird in der Spalte Job nach clerk gesucht und in diesen Zeilen das Gehalt mit 0.9 multipliziert.
Weiterhin wird in der Spalte Job nach salesman gesucht und in diesen Zeilen das Gehalt mit 0.8 multipliziert.
Für alle anderen Zeilen gilt, dass das Gehalt ungekürzt ausgegeben wird.
select 12345.6789 as Zahl, round(12345.6789,2) as Gerundet from dual ; ZAHL GERUNDET --------------------- 12345,6789 12345,68Die Zahl 12345.6789 wird auf zwei Nachkommastellen gerundet.
select 12345.6789 as Zahl, round(12345.6789,-2) as Gerundet from dual ; ZAHL GERUNDET -------------------- 12345,6789 12300Die Zahl 12345.6789 wird auf zwei Stellen vor dem Komma gerundet.
select 12345.6789 as Zahl, trunc(12345.6789,2) as Abgeschnitten from dual ; ZAHL ABGESCHNITTEN ----------------------- 12345,6789 12345,67Die Zahl 12345.6789 wird auf zwei Nachkommastellen abgeschnitten.
select 12345.6789 as Zahl, trunc(12345.6789,-2) as Abgeschnitten from dual ; ZAHL ABGESCHNITTEN ------------------------- 12345,6789 12300Die Zahl 12345.6789 wird auf zwei Stellen vor dem Komma abgeschnitten.
Datum + Zahl = Datum Datum - Zahl = Datum Datum - Datum = Anzahl der Tage
select sysdate-1 as "Gestern", sysdate as "Heute", sysdate+1 as "Morgen" from dual ; Gestern Heute Morgen ---------------------------- 26.12.03 27.12.03 28.12.03Es werden die Dati von Gestern, Heute und Morgen ausgegeben.
select sysdate - hiredate as "Tage als Angestellter" from emp; Tage als Angestellter --------------------- 8091,85933 8026,85933 ...Es wird vom aktuellen Datum (sysdate) das Einstellungsdatum abgezogen. Ausgegeben wird nun die Anzahl von Tagen zwischen dem aktuellen Datum (sysdate) und dem Einstellungsdatum.
select ename as "Nachname",
months_between(sysdate,hiredate)/12 as "Jahre als Angestellter"
from emp
;
Nachname Jahre als Angestellter
--------------------------------
SMITH 22,1528973
ALLEN 21,9781661
Es werden die Monate zwischen dem aktuellen Datum (sysdate) und dem Einstellungsdatum ermittelt.
Das Ergebnis sind demnach die Monate, die die Person angestellt ist.
Dieser Wert wird durch 12 geteilt, und als Ergebnis ist nicht mehr in Monaten, sondern in Jahren.
select ename as "Nachname",add_months(hiredate,12*25) as "Gehaltserhöhung" from emp ; Nachname Gehaltserhöhung ------------------------- SMITH 17.12.05 ALLEN 20.02.06Zu dem Einstellungsdatum werden 12*25 Monate, also 25 Jahre, addiert. Dieses Datum wird ausgegeben. Es wird also der Tag 25 Jahre nach dem Einstellungsdatum ausgegeben. In diesem Fall ist an diesem Tag eine Gehaltserhöhung vom Chef geplant.
Stefan Hietel dama.go GmbH, Robert Warnke http://rowa.giso.de