Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment rechercher des lignes en filtrant un texte spécifique à l'aide de la recherche en texte intégral dans MS SQL 2012

Je ne pense pas qu'une recherche plein texte vous aiderait. Il semble que vous recherchiez n'importe quel fragment, même des termes techniques tels que /1/ .

Essayez ceci pour XML

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

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

Il vérifiera le text() interne de n'importe quel nœud s'il contient la phrase de recherche. Mais toute valeur avec un 1 à l'intérieur est trouvé (par exemple, tout nombre sans rapport qui a un 1 quelque part.) Vous pouvez rechercher text()="1" et effectuer le contains uniquement si la longueur de la chaîne dépasse un certain minimum.

Quelque chose comme

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 n'est - jusqu'à présent - rien de plus qu'une chaîne et doit être analysé. Avec la v2016, Microsoft a introduit le support JSON, mais vous êtes sur la v2012. Le problème avec un LIKE rechercher sur une chaîne JSON pourrait être que vous trouveriez le 1 même en tant que partie du nom d'un élément. Le reste est comme ci-dessus...

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