Domanda

Ho bisogno di qualcosa tra una ricerca full-text e una ricerca indice:
Voglio cercare del testo in una colonna della mia tabella (probabilmente ci sarà anche un indice sulla colonna, se questo è importante).

Il problema è che voglio cercare parole nella colonna, ma non voglio abbinare parti.

Ad esempio, la mia colonna potrebbe contenere nomi di attività:
   Mighty Muck Miller and Partners Inc.
  Boy & amp; Butter Breakfast company

Ora se cerco " Miller " Voglio trovare la prima riga. Ma se cerco " iller " Non voglio trovarlo, perché non c'è una parola che inizia con "iller". Ricerca di " Break " dovrebbe trovare " Boy & amp; Butter Breakfast company " ;, tuttavia, poiché una parola inizia con " Break " ;.

Quindi, se provo ad usare

WHERE BusinessName LIKE %Break%

troverà troppi risultati.

Esiste un modo per cercare parole separate da spazi bianchi o altri delimitatori ?

(LINQ sarebbe il migliore, anche SQL semplice)

Importante: gli spazi non sono di gran lunga gli unici delimitatori! Barre, due punti, punti, tutti i caratteri non alfanumerici dovrebbero essere considerati affinché questo funzioni!

È stato utile?

Soluzione

SQL Server 2000 o versioni successive.

SELECT *
  FROM dbo.TblBusinessNames
 WHERE BusinessName like '%[^A-z^0-9]Break%' -- In the middle of a sentence
    OR BusinessName like 'Break%'            -- At the beginning of a sentence

Riferimento parola chiave per MI PIACE : http://msdn.microsoft.com/en-us/library/aa933232 (SQL.80) .aspx

Altri suggerimenti

I delimitatori di parole saranno molti: spazio, tabulazione, inizio di riga, parentesi, punti, virgole, punti esclamativi / punti interrogativi ecc. Quindi, una soluzione abbastanza semplice è usare una regex nella clausola WHERE. (E sarà molto più efficiente di ORing ogni possibile delimitatore che ti viene in mente.)

Dato che hai menzionato LINQ, ecco un articolo che descrive come fare regex efficiente interrogazione con SQL Server .

Complicate DOVE clausole come questa sollevano sempre una bandiera rossa con me per quanto riguarda le prestazioni, quindi consiglio vivamente di fare un benchmark di qualunque cosa tu stia finendo, potresti decidere di costruire un indice di ricerca per la colonna dopo tutto.

MODIFICA: Ho visto che hai modificato la tua domanda. Quando scrivendo la tua regex , è facile utilizzarlo come delimitatore usando qualsiasi carattere non alfanico, ovvero [^ 0-9a-zA-Z] o \ W per qualsiasi carattere non verbale, \ b per qualsiasi limite di parole e \ B per qualsiasi limite di non parole. Oppure, anziché abbinare i delimitatori, basta abbinare qualsiasi parola, ad esempio \ w +. Ecco un altro esempio di qualcuno che esegue ricerche di regex con SQL Server ( più complicato di quello di cui avresti bisogno).

where BusinessName like 'Break%' -- to find if it is beginning with the word
or BusinessName like '% Break%' -- to find if it contains the word anywhere but the beginning
WHERE BusinessName LIKE '% Break%'

Hai menzionato LINQ: potresti fare qualcosa come ...

string myPattern = "% Break%";

var query =
      from b in Business
      where SqlMethods.Like(b.BusinessName, myPattern) 
      select b;

Si noti che questo utilizza lo spazio dei nomi System.Linq.Data.SqlClient che si traduce direttamente nell'operatore LIKE senza ulteriore elaborazione.

Prova questo:

declare @vSearch nvarchar(100)

set @vSearch = 'About'

select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top