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
FROM dual;
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):
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'#',#'||
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 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.