Hallo,
du könntest dir z.B. eine Funktion machen, der du ein Array aus Spalten sowie ein Array aus Suchwörtern übergibst (sowie einen Parameter, der besimmt, ob alle Wörter vorkommen müssen oder nur eins davon), und diese generiert dann den SQL-String. z.B.
Public Function GenerateSQLSearchString(Columns() As String, Words() As String, _
AlleWorterVorkommen As Boolean) As String
Dim sqlString As String
Dim i As Long, j As Long
For i = 0 To UBound(Words)
If Len(Words(i)) > 0 Then 'Wenn das Wort leer ist, keinen Ausdruck
' angeben
If i > 0 Then sqlString = sqlString & _
IIf(AlleWorterVorkommen, " AND ", " OR ")
sqlString = sqlString & "("
For j = 0 To UBound(Columns)
If j > 0 Then sqlString = sqlString & " OR "
sqlString = sqlString & Columns(j) & " LIKE '%" + Words(i) + _
"%'"
Next
sqlString = sqlString & ")"
End If
Next
GenerateSQLSearchString = sqlString
End Function Man könnte sie dann z.B. so aufrufen:
Dim Spalten() As String
ReDim Spalten(2)
Spalten(0) = "Spalte1"
Spalten(1) = "Spalte2"
Spalten(2) = "Spalte3"
Dim Suchstring As String
Suchstring = "Wort1 Wort2"
Dim Woerter() As String
Woerter = Split(Suchstring, " ") 'Suchstring über Leerzeichen in String-Array
' splitten
MsgBox GenerateSQLSearchString(Spalten, Woerter, False) (der Suchstring wäre dann natürlich später variabel). Dann generiert die Funktion einen entsprechenden SQL-Ausdruck, welcher an den WHERE-Teil eines SQL-Strings angehängt werden kann.
Diese Funktion demonstriert jetzt nur das Prinzip und sollte so natürlich keinesfalls in fertigen Programmen so verwendet werden, da:
- LIKE-Spezialzeichen nicht espaced werden (und der Anwender dadurch selbst LIKE-Operatoren verwenden kann (was die Ergebnisse verfälscht), außer natürlich dies ist ausdrücklich so gewollt).
- Parameter einfach in den SQL String eingefügt werden, was SQL Injection ermöglicht
- der Fall nicht gehandhabt wird, wenn nur leere Wörter (mit 0 Zeichen) oder ein leeres Array vorliegt, da dies einen leeren String zurückgibt. Man könnte aber beim Aufruf der Funktion testen, ob die Länge des Strings 0 ist, und wenn ja, z.b. den WHERE-Parameter weglassen (damit nicht etwas ungültiges wie "SELECT .. FROM Tabelle WHERE;" generiert wird).
Des Weiteren könnte man die Anzahl der Wörter, die man zur Suche zulässt, beschränken, um nicht einen zu langen SQL-Ausdruck zu produzieren.
Da bei einer Datenbank standardmäßig ein Stringvergleich verwendet wird, der Groß-Kleinschreibung entsprechend verarbeitet, wird auch eine Spalte mit "TeSt" bei der Suche nach "test" gefunden, ohne dass man die Strings vorher normalisiert.
Beitrag wurde zuletzt am 23.08.11 um 19:01:22 editiert. |