Ich habe vier Spalten mit Namen und möchte diese mit einer LIKE
in einer Microsoft SQL Server-Umgebung durchsuchen .
Die Komplikation kommt , dass Namen kann links und rechts Apostrophe / gewinkelt Apostrophe (dh umfassen ‘
und ’
, char(145)
und char(146)
jeweils), die einen geraden Apostroph übereinstimmen sollte (dh '
, char(39)
)
Folgendes zu tun ist sehr langsam:
SELECT person_id
FROM person
WHERE REPLACE(
REPLACE(
person_name,
CHAR(145),
CHAR(39)
),
CHAR(146),
CHAR(39)
) LIKE '{USER_INPUT}'
Wie in der SQL-Ersetzungsanweisung erläutert , REPLACE
die beim Stapelüberlauf zu langsam ist , liegt dies daran, dass die Verwendung von die Anweisung nicht aufladbar macht.
Gibt es eine Möglichkeit, wie SQL Server mit solchen Situationen besser umgehen kann?
Eine Lösung , die vorgeschlagen wurde , ist die Anwendung zu haben , erzeugt einen ‚suchbar‘ Wert, der alle Felder verkettet ( person_name
, person_surname
, person_nickname
, etc.) und wandelt die problematischen Zeichen an der Stelle der Bearbeitung. Dies könnte effektiv indiziert und durchsucht werden. Das Speichern dieser Daten in einer separaten SQL-Tabelle / -Spalte würde weniger Umschreiben der Anwendung erfordern als das Implementieren einer vollständigen NoSQL-Lösung wie Lucene.
Das obige Beispiel ist eine Vereinfachung: Die Abfrage wird nicht wie oben erläutert buchstäblich erstellt, und wir implementieren SQL-Injection-Schutz (und andere).
Die Frage ist, wie die abgewinkelten Apostrophe in den Tabellendaten durch gerade ersetzt werden können. Zu klären:
- Benutzerbedarf
O‘Malley
- dies sollte mit beidenO‘Malley
oder übereinstimmenO'Malley
- Benutzerbedarf
O'Malley
- dies sollte mit beidenO‘Malley
oder übereinstimmenO'Malley
Wir müssen die SQL-Daten ersetzen, nicht die Benutzereingaben. Wir können die Benutzereingaben auf dem Weg durch die Anwendung so konvertieren, dass wir sie in einfache Apostrophe ändern, wenn sie abgewinkelte Apostrophe eingeben, bevor wir sie an SQL übergeben. Es sind die Daten in SQL, die wir standardisieren müssen.
Leider müssen die Daten als korrekte abgewinkelte Klammer in der Datenbank verbleiben, aber wenn wir die Suche durchführen, müssen wir sie alle mit geraden Apostrophen vergleichen.