ordre d'union, mais garder distinct

comment interroger une table Stocker (ID, Titre, Société) pour get tous les loggings où le titre contient "terme" montrant des loggings entièrement appariés d'abord puis des correspondances partielles. en d'autres termes si je suis à la search de "foo" je baguette loggings affichés comme

  • Foo et ses fils
  • bon foo
  • foo bar
  • Football
  • Herfooles

Voici ce que j'ai

Create PROCEDURE [dbo].[SearchUserInfo] @query nvarchar(500), @term nvarchar(500) (SELECT Title,Company, 1 as match FROM Stores WHERE CONTAINS(Title, @query)) UNION (SELECT Title,Company, 0 as match FROM Stores WHERE Title like '%' + @term +'%') order by match desc 

le problème avec cette requête est qu'il renvoie des loggings en double. si je supprime 0 comme match tehn je ne sais pas comment sortinger si les résultats de CONTAINS apparaîtront avant les résultats de LIKE.

Merci

Vous pouvez combiner les deux sets de résultats, puis utiliser GROUP BY pour supprimer les duplicates et ORDER BY MAX(match) DESC pour placer les groupes renvoyés par CONTAINS premier

 ;WITH CTE AS (SELECT Title, Company, 1 AS match FROM Stores WHERE CONTAINS(Title, @query) UNION ALL SELECT Title, Company, 0 AS match FROM Stores WHERE Title LIKE '%' + @term + '%') SELECT Title, Company, FROM CTE GROUP BY Title, Company ORDER BY MAX(match) DESC 

Si vous ne souhaitez pas utiliser la search en text intégral, vous pouvez le faire avec une seule requête:

 select title, company, (case when MatchType like 'FULL%' then 1 else 0 end) as Match from (select title, company, (case when title like concat(@query, ' %') then 'FULL START' when title like concat('% ', @query) then 'FULL END' when title like concat('% ', @query, ' %') then 'FULL MIDDLE' when title like concat(@query, '%') then 'PARTIAL START' when title like concat('%', @query) then 'PARTIAL END' when title like concat('%', @query, '%') then 'PARTIAL MIDDLE' else 'NONE' end) as MatchType from Stores ) s where MatchType <> 'NONE' order by MatchType 

Cela peut ne pas vous donner la flexibilité que vous voulez en termes de délimiteurs sur les mots. Mais, cela vous donne plus de contrôle sur la nature de l'appariement et de l'ordre qui en résulte.