sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Seleccionar palabras clave similares en cualquier orden

Parece que estás realmente buscando la búsqueda de texto completo, especialmente porque desea ponderar las palabras.

Para usar LIKE , tendrá que usar varias expresiones (una por palabra, por columna), lo que significa SQL dinámico. No sé qué idioma estás usando, así que no puedo darte un ejemplo, pero tendrás que producir una declaración como esta:

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.

Desafortunadamente, esa es realmente la única forma de hacerlo. El uso de la búsqueda de texto completo le permitiría reducir sus criterios a uno por columna, pero aún tendrá que especificar las columnas explícitamente.

Dado que está utilizando SQL Server, voy a arriesgarme a adivinar que esta es una pregunta de C#. Tendrías que hacer algo como esto (asumiendo que estás construyendo el SqlCommand o DbCommand objetar usted mismo; si está utilizando un ORM, todas las apuestas están canceladas y probablemente no estaría preguntando esto de todos modos):

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