Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Wählen Sie ähnliche Schlüsselwörter in beliebiger Reihenfolge aus

Es hört sich so an, als wärst du wirklich Suchen Sie nach Volltextsuche, zumal Sie die Wörter gewichten möchten.

Um LIKE zu verwenden , müssen Sie mehrere Ausdrücke verwenden (einen pro Wort, pro Spalte), was dynamisches SQL bedeutet. Ich weiß nicht, welche Sprache Sie verwenden, daher kann ich Ihnen kein Beispiel geben, aber Sie müssen eine Anweisung wie diese erstellen:

Für "Hula Hoops":

where (ProductName like '%hula%' or ProductName like '%hoops%')
  and (Description like '%hula%' or Description like '%hoops%')
  and (ShortName like '%hula%' or ShortName like '%hoops%')

usw.

Leider ist das wirklich der einzige Weg, es zu tun. Die Verwendung der Volltextsuche würde es Ihnen ermöglichen, Ihre Kriterien auf eins pro Spalte zu reduzieren, aber Sie müssen die Spalten trotzdem explizit angeben.

Da Sie SQL Server verwenden, gehe ich davon aus, dass dies eine C#-Frage ist. Sie müssten so etwas tun (vorausgesetzt, Sie erstellen den SqlCommand oder DbCommand widersprechen Sie sich; Wenn Sie ein ORM verwenden, sind alle Wetten abgeschlossen und Sie würden dies wahrscheinlich sowieso nicht fragen):

SqlCommand command = new SqlCommand();
int paramCount = 0;

string searchTerms = "Hula Hoops";

string commandPrefix = @"select *

from Products";

StringBuilder whereBuilder = new StringBuilder();

foreach(string term in searchTerms.Split(' '))
{
    if(whereBuilder.Length == 0)
    {
        whereBuilder.Append(" where ");
    }
    else
    {
        whereBuilder.Append(" and ");
    }

    paramCount++;

    SqlParameter param = new SqlParameter(string.Format("param{0}",paramCount), "%" + term + "%");

    command.Parameters.Add(param);

    whereBuilder.AppendFormat("(ProductName like @param{0} or Description like @param{0} or ShortName like @param{0})",paramCount);
}

command.CommandText = commandPrefix + whereBuilder.ToString();