Als PDF Downloaden!

Werbung
Tipps & Tricks: Juli 2008
Bereich:
SQL
Erstellung:
07/2008 MM
Versionsinfo:
8.2 9.2 10.2 11.1
Letzte Überarbeitung:
05/2009 BK
Quote Operator
Hatten Sie auch schon mal mit (einfachen) Anführungszeichen ( ' ) in Ihrer Datenbank zu kämpfen?? Entweder
sie sind durch einen Ladevorgang mit fehlerhaften Daten (ungewollt) entstanden und sollen nun bereinigt werden
oder sie sind ein korrekter Teil Ihres Datenbestandes, der durch Lese- bzw. Schreiboperationen angesprochen
werden soll.
Egal, ob für Sie der erste oder der zweite Fall zutrifft, da das Anführungszeichen in aller Regel den Anfang bzw.
das Ende eines Strings kennzeichnet, bedarf es schon eines Tricks, um es gezielt als Teil eines Strings zu
verwenden.
Im folgenden Beitrag werden verschiedene Beispiele mit jeweils zwei Lösungsmöglichkeiten (mit bzw. ohne
Quote Operator) vorgestellt. Da der Quote Operator erst ab Version 10g zulässig ist, muss in älteren Versionen
mit anderen Mitteln (z.B. CHR(39)) gearbeitet werden.
Beispiel 1
Das Anführungszeichen ist Teil des zurückgegebenen Strings. Es soll der folgende String ausgegeben werden
"Willkommen auf Muniqsoft's Homepage".
Lösung mit Quote Operator:
SQL> SELECT q'#Willkommen auf Muniqsoft's Homepage#' as intro FROM dual;
INTRO
----------------------------------Willkommen auf Muniqsoft's Homepage
Lösung ohne Quote Operator (diese basiert auf einem zu ASCII kompatiblen Zeichensatz):
SQL> SELECT 'Willkommen auf Muniqsoft'||CHR(39)||'s Homepage' as intro
dual;
FROM
Beispiel 2
Das Anführungszeichen ist Teil eines Strings, der über einen INSERT-Befehl in eine Tabelle eingetragen werden
soll.
Achtung: Für das Beispiel muss die ENAME-Spalte der EMP-Tabelle auf VARCHAR2(12) verlängert werden.
Lösung mit Quote Operator:
SQL> INSERT INTO scott.emp (empno, ename)
VALUES ( 8000, q'#Hell's Angel#' );
Lösung ohne Quote Operator (diese basiert auf einem zu ASCII kompatiblen Zeichensatz):
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 1 von 3
SQL> INSERT INTO scott.emp (empno, ename)
VALUES ( 8000, 'Hell'||CHR(39)||'s Angel' );
Beispiel 3
Es sollen alle Werte aus einer Spalte ermittelt werden, die ein Anführungszeichen enthalten.
Lösung mit Quote Operator:
SQL> SELECT empno, ename FROM scott.emp
WHERE ename LIKE q'#%'%#';
EMPNO ENAME
----- -----------8000 Hell's Angel
Lösung ohne Quote Operator (diese basiert auf einem zu ASCII kompatiblen Zeichensatz):
SQL> SELECT empno, ename FROM scott.emp
WHERE ename LIKE '%'||chr(39)||'%';
Eine weitere Alternative bietet die in 10g eingeführte REGEXP_LIKE-Funktion:
SQL> SELECT empno, ename FROM scott.emp
WHERE REGEXP_LIKE(ename, CHR(39));
Beispiel 4
Die Anführungszeichen in einer einzelnen Spalte sind ungewollt und sollen entfernt werden.
Lösung mit Quote Operator:
SQL> UPDATE scott.emp SET ename = REPLACE(ename, q'#'#', '')
WHERE ename LIKE q'#%'%#';
Lösung ohne Quote Operator (diese basiert auf einem zu ASCII kompatiblen Zeichensatz):
SQL> UPDATE scott.emp SET ename = REPLACE(ename, chr(39), '')
WHERE ename LIKE '%'||chr(39)||'%';
Beispiel 5
Es soll ein Skript erzeugt werden, das zu jedem Datensatz der EMP-Tabelle einen entsprechenden
INSERT-Befehl erzeugt. Damit können Sie sich die Inhalte Ihrer wichtigsten Tabelle sichern.
Lösung mit Quote Operator:
SQL> SELECT 'INSERT INTO scott.emp VALUES
('||empno||q'#,'#'||ename||q'#','#'||job||q'#',#'||
decode(mgr,
null, 'NULL', mgr) ||q'#,'#'||
hiredate||q'#',#'||
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 2 von 3
decode(sal,
null, 'NULL', sal) ||','||
decode(comm, null, 'NULL', comm) ||','||
decode(deptno, null, 'NULL', deptno)||');'
AS emp_insert_befehle
FROM scott.emp;
Lösung ohne Quote Operator:
SQL> SELECT 'INSERT INTO scott.emp VALUES
('||empno||','''||ename||''','''||job||''','||
decode(mgr,
null, 'NULL', mgr) ||','''||
hiredate||''','||
decode(sal,
null, 'NULL', sal) ||',' ||
decode(comm, null, 'NULL', comm) ||',' ||
decode(deptno, null, 'NULL', deptno)||');'
AS emp_insert_befehle
FROM scott.emp;
Fazit
Die vorangegangenen Beispiele haben Ihnen einen Überblick im Umgang mit Anführungszeichen gegeben und
Ihnen den in Version 10g neu eingeführten Quote Operator vorgestellt. Stattdessen kann natürlich auch in den
Versionen 10g und 11g weiterhin die Charakterdarstellung des ASCII-Wertes 39 benutzt werden (CHR(39)).
Egal, welche Variante Sie einsetzen, wir hoffen, dass Sie nun allen Problemen mit Anführungszeichen
gewachsen sind.
Die Verallgemeinerung des letzten Beispiels für eine beliebige Tabelle ist etwas komplizierter und allein mit
SQL-Mitteln nicht zu erreichen. Die Lösung dafür heben wir uns für einen der folgenden Tipps des Monats auf,
also bleiben Sie interessiert. ;-)
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 3 von 3
Herunterladen