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

Come trovare le righe filtrando un testo specifico utilizzando la ricerca di testo completo in MS SQL 2012

Non credo sia una ricerca full-text ti aiuterebbe. Sembra che tu stia cercando qualsiasi frammento anche come termini tecnici come /1/ .

Prova questo per XML

 DECLARE @SearchFor VARCHAR(100)='1';

 SELECT * 
 FROM SettingsData
 WHERE xmldata.exist(N'//*[contains(text()[1],sql:variable("@SearchFor"))]')=1;

Verificherà il text() interno di qualsiasi nodo se contiene la frase di ricerca. Ma qualsiasi valore con un 1 viene trovato all'interno (ad es. qualsiasi numero non correlato che ha un 1 da qualche parte.) Potresti cercare text()="1" ed esegui i contains solo se la lunghezza della stringa supera un certo minimo.

Qualcosa come

WHERE xmldata.exist(N'//*[text()[1]=sql:variable("@SearchFor") or(string-length(text()[1])>=3 and contains(text()[1],concat("/",sql:variable("@SearchFor"),"/")))]')=1;

Json è - fino ad ora - nient'altro che una stringa e deve essere analizzato. Con v2016 Microsoft ha introdotto il supporto JSON, ma sei su v2012. Il problema con un LIKE la ricerca su una stringa JSON potrebbe essere quella di trovare 1 anche come parte del nome di un elemento. Il resto è come sopra...

 SELECT *
 FROM SettingsData
 WHERE jsondata LIKE '%' + @SearchFor + '%';