Heim >Datenbank >MySQL-Tutorial >Wie parametrisiert man SQL-Abfragen richtig mit LIKE- und IN-Klauseln?

Wie parametrisiert man SQL-Abfragen richtig mit LIKE- und IN-Klauseln?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-30 07:00:11352Durchsuche

How to Properly Parameterize SQL Queries with LIKE and IN Clauses?

Parametrierte Abfragen mit LIKE- und IN-Bedingungen

Ein häufiges Hindernis bei parametrisierten Abfragen ist die Handhabung komplexer Bedingungen mit IN- und LIKE-Klauseln. In solchen Szenarien ist es wichtig sicherzustellen, dass die richtige Syntax verwendet wird, um sowohl Parametrisierung als auch Effektivität zu erreichen.

Stellen Sie sich das folgende Szenario vor:

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID IN (@categoryids) 
      OR  name LIKE '%@name%'
", 
   conn);
comm.Parameters.Add("@categoryids", SqlDbType.Int);
comm.Parameters["@categoryids"].Value = CategoryIDs;
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = Name;

Hier besteht das Ziel darin, eine Abfrage zu erstellen das Produkte basierend auf einer durch Kommas getrennten Liste von Kategorie-IDs (CategoryIDs) und einer Zeichenfolge (Name) abruft, die Sonderzeichen enthalten kann. Der obige Code funktioniert jedoch nicht ordnungsgemäß, weil:

  • CategoryIDs fälschlicherweise sowohl SqlDbType.Int als auch SqlDbType.String zugewiesen ist.
  • Name ist SqlDbType.Int zugewiesen falsch für eine Zeichenfolge.
  • Sonderzeichen im Namen werden nicht behandelt richtig.

Die richtige Syntax erfordert einen mehrstufigen Ansatz:

  1. Einzelne Parameternamen erstellen: Erstellen Sie eine Liste von Parameternamen für jede Kategorie ID, z. B. @p0, @p1, @pN-1.
  2. Parameter hinzufügen zu Befehl: Durchlaufen Sie die Kategorie-IDs, erstellen und fügen Sie für jede einen Parameter unter Verwendung des entsprechenden Parameternamens hinzu.
  3. Fuzzy-Match für Namen erstellen: Verketten Sie % um den Namensparameter in die Abfragezeichenfolge, um die Fuzzy-Suche zu aktivieren.

Der folgende Code demonstriert die Überarbeitung Ansatz:

string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
                                1618, 1619, 1620, 1951, 1952,
                                1953, 1954, 1955, 1972, 2022 };

SqlCommand comm = conn.CreateCommand();

string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
   parameters[i] = "@p"+i;
   comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",$"%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";

Dieser Code erzeugt eine vollständig parametrisierte Abfrage, die die Anforderungen sowohl der IN- als auch der LIKE-Bedingungen erfüllt.

Das obige ist der detaillierte Inhalt vonWie parametrisiert man SQL-Abfragen richtig mit LIKE- und IN-Klauseln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn