2

テーブル Store(ID,Title,Company) にクエリを実行して、タイトルに「用語」が含まれるすべてのレコードを取得し、最初に完全に一致したレコードを表示し、次に部分一致を表示する方法。つまり、「foo」を探している場合、次のように表示されるレコードをワンドします

  • フーと息子たち
  • グッドフー
  • フーバー
  • フットボール
  • ハーフール

私が持っているものはこちら

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

このクエリの問題は、重複したレコードが返されることです。一致するものとして 0 を削除すると、ソート方法がわからないため、CONTAINS からの結果が LIKE からの結果の前に表示されます。

ありがとう

4

2 に答える 2

2

2 つの結果セットを結合してGROUP BYから、重複を削除し、最初ORDER BY MAX(match) DESCに返されたグループを配置するために使用できます。CONTAINS

;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
于 2012-12-12T21:03:30.000 に答える
0

全文検索を使用したくない場合は、単一のクエリでこれを行うことができます。

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

これでは、単語の区切り文字に関して必要な柔軟性が得られない場合があります。ただし、一致の性質と結果の順序をより詳細に制御できます。

于 2012-12-12T21:26:35.200 に答える