SQL: Suche nach mehreren Begriffen über mehrere Felder

Eines vorweg - grundsätzlich sollte man SQL-Befehle nicht, wie hier beschrieben, im Code zusammenbauen. Ein Problem sind vor allem SQL-Injections welche z.B. so umgangen werden können.

Hier soll daher nur der Aufbau eines SQL-Statements, daß mehrere Suchbegriffe über mehrere Felder (Tabellen-Spalten) suchen kann, beschrieben werden. Einzelne Begriffe werden mit UND verknüpft.

// C#

// String mit mehreren Begriffen, von z.B. einer TextBox
string searchWords = TextBox1.Text;

// die einzelnen Suchbegriffe in ein Array packen
string[] searchWordsArray = searchWords.Trim().Split();

// beginn des SQL-Statements...
string sqlStatement = "SELECT * FROM Tabelle WHERE";

// Prüfung - gibt es überhaupt was zu suchen
if (!string.isEmptyOrNull(searchWords.Trim()))
{
  // einzelne Suchbegriffe extrahieren
  foreach (string searchWord in searchWordsArray)
  {
    // Begriff darf in irgendeinem Felder stehen > ODER,
    // zweiter Begriff aber auch in irgendeinem Feld > UND
    sqlStatement += "(Spalte1 LIKE '%" + searchWord + "%' OR Spalte2 LIKE '%" + searchWord + "%') AND ";
  }

  // letzte 4 Zeichen (AND) löschen
  sqlStatement = sqlStatement.Substring(0,sqlStatement.Length-5);
}

// ggf. noch eine Sortierung einfügen...
sqlStatement += " ORDER BY DateCreated DESC ";

SQL bei der Suche nachf: "A":

SELECT *
FROM Tabelle
WHERE (Spalte1 LIKE '%" + A + "%' OR Spalte2 LIKE '%" + A + "%')
ORDER BY DateCreated DESC

SQL bei der Suche nach: "A B C":

SELECT *
FROM Tabelle
WHERE (Spalte1 LIKE '%" + A + "%' OR Spalte2 LIKE '%" + A + "%') AND
     (Spalte1 LIKE '%" + B + "%' OR Spalte2 LIKE '%" + B + "%') AND
     (Spalte1 LIKE '%" + C + "%' OR Spalte2 LIKE '%" + C + "%')
ORDER BY DateCreated DESC

SQL

Februar 2009 | Permalink | Feedback