Es gibt eine Reihe von Verlgeichsoperatoren beim Firebird für Strings mit
einigen Besonderheiten (SQL-Norm!):
= (Gleichheitszeichen)
Vergleicht zwei Strings auf Identität.
SELECT * FROM RDB$DATABASE WHERE 'AAA' = 'AAA' liefert ein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' = 'AAa' liefert kein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' = UPPER('AAa') liefert ein Ergebnis.
aber SELECT * FROM RDB$DATABASE WHERE 'AAA' = 'AAA ' liefert ein Ergebnis,
d.h. folgende Leerzeichen werden ignoriert.
wohingegen SELECT * FROM RDB$DATABASE WHERE 'AAA' = ' AAA' kein Ergebnis
liefert, d.h. vorangehende Leerzeichen werden nicht ignoriert.
LIKE (Ähnlichkeits-Suche)
Vergleicht zwei Strings auf Ähnlichkeit, wobei die Ähnlichkeit durch
Wildcards angegeben wird. Gültig sind dabei:
* % kein oder beliebig viele Zeichen
* _ ein beliebiges Zeichen
Es müssen bei der Suche mit LIKE wildcards angegeben werden.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'AAA%' liefert ein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'AA%' liefert ein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'AAA_' liefert kein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'AA_' liefert ein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'A_' liefert kein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'A%' liefert ein Ergebnis.
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'A' liefert kein Ergebnis, ist
aber syntaktisch falsch.
Firebird hält sich dabei an den SQL-92 Standard.
STARTING WITH (Suche nach Identität am Anfang einer Zeichenkette)
SELECT * FROM RDB$DATABASE WHERE 'AAA' STARTING WITH 'A' ist äquivalent zu
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE 'A%'.
CONTAINING (Suche nach Substring)
SELECT * FROM RDB$DATABASE WHERE 'AAA' CONTAINING 'A' ist äquivalent zu
SELECT * FROM RDB$DATABASE WHERE 'AAA' LIKE '%A%'.
Datentypen?
Die hier beschriebenen Operatoren beziehen sich vorallem auf CHAR und
VARCHAR-Felder.
Sie können auch auf BLOBS angewendet werden mit foilgenden Einschränkungen
(Information aus Developer-Mailingliste, nicht wirklich dokumentiert!):
* Der LIKE Operator durchsucht nur die ersten 1024 bytes des ersten
Segments eines BLOB.
* Der CONTAINING Operator durchsucht komplette BLOBs, zumindes bis 10k
Grösse.
Performance
Bei der Suche mit LIKE und mit CONTAINING können in der Rergel keine
Indizes verwendet werden, so dass Suchabfragen länger brauchen können.
Ausnahme: Bei LIKE 'A%' was äquivalent zu BEGINNING WITH 'A' ist, kann
einen Index verwenden, wenn das Such-Feld indiziert wurde.
Anmerkung zu den Beispielen
Der Ausdruck aber SELECT * FROM RDB$DATABASE wird zum Illustrieren der
Funktion verwendet, da es sich bei der verwendeten System-Tabelle um eine
Tabelle mit immer genau einer Zeile handelt und somit bei wahrer Bedingung
genau ein Satz zurückgeliefert wird.