Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Select como palavras-chave em qualquer ordem


Parece que você está realmente procurando por pesquisa de texto completo, especialmente porque você deseja ponderar as palavras.

Para usar LIKE , você terá que usar várias expressões (uma por palavra, por coluna), o que significa SQL dinâmico. Não sei qual idioma você está usando, então não posso fornecer um exemplo, mas você terá que produzir uma declaração assim:

Para "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.

Infelizmente, essa é realmente a única maneira de fazê-lo. Usar a pesquisa de texto completo permitiria reduzir seus critérios para um por coluna, mas você ainda terá que especificar as colunas explicitamente.

Como você está usando o SQL Server, vou arriscar um palpite de que essa é uma pergunta C#. Você teria que fazer algo assim (supondo que você esteja construindo o SqlCommand ou DbCommand objetar-se; se você estiver usando um ORM, todas as apostas serão canceladas e você provavelmente não estaria perguntando isso de qualquer maneira):
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();