Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Seleziona parole chiave simili in qualsiasi ordine

Sembra che tu sia davvero cercando la ricerca full-text, soprattutto perché vuoi appesantire le parole.

Per usare LIKE , dovrai utilizzare più espressioni (una per parola, per colonna), il che significa SQL dinamico. Non so quale lingua stai usando, quindi non posso fornire un esempio, ma dovrai produrre una dichiarazione del tipo:

Per "Hula Hoop":

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

ecc.

Sfortunatamente, questo è davvero l'unico modo per farlo. L'utilizzo della ricerca a testo intero ti consentirebbe di ridurre i criteri a uno per colonna, ma dovrai comunque specificare le colonne in modo esplicito.

Dato che stai usando SQL Server, azzarderò indovinare che questa è una domanda C#. Dovresti fare qualcosa del genere (supponendo che tu stia costruendo il SqlCommand o DbCommand obiettare te stesso; se stai usando un ORM, tutte le scommesse sono disattivate e probabilmente non lo chiederesti comunque):

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