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