Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Sélectionnez des mots-clés similaires dans n'importe quel ordre

On dirait que vous êtes vraiment rechercher une recherche en texte intégral, d'autant plus que vous souhaitez pondérer les mots.

Pour utiliser LIKE , vous devrez utiliser plusieurs expressions (une par mot, par colonne), ce qui signifie SQL dynamique. Je ne sais pas quelle langue vous utilisez, donc je ne peux pas donner d'exemple, mais vous devrez produire une déclaration comme celle-ci :

Pour "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%')

etc.

Malheureusement, c'est vraiment la seule façon de le faire. L'utilisation de la recherche en texte intégral vous permettrait de réduire vos critères à un par colonne, mais vous devrez quand même spécifier explicitement les colonnes.

Puisque vous utilisez SQL Server, je vais risquer de deviner qu'il s'agit d'une question C#. Vous devriez faire quelque chose comme ça (en supposant que vous construisez le SqlCommand ou DbCommand objectez-vous; si vous utilisez un ORM, tous les paris sont ouverts et vous ne poseriez probablement pas cette question de toute façon) :

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();