2017-05-19 5 views
0

GOAL:可能であれば、それぞれ独自の検索文字列値と順序を持つ3つの異なる列の検索に基づいて結果を返します。FREETEXTABLEを使用して複数の列を検索する

ルール

  1. 任意の列が
  2. 結果渡されnullない限りがそれぞれの列にすべての検索文字列を含む必見を検索することができるようにします
  3. すべて検索IF文字列がnullの場合、空の結果を返します

現在のストアドプロシージャ:

私は、上記の規則を遵守するために、多くの研究の後、この思い付くことができました。

ALTER PROCEDURE [Application].[usp_Institution_Search] 
    @RowCount INT = 100, 
    @Name NVARCHAR(255), 
    @City NVARCHAR(255), 
    @Country NVARCHAR(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF ISNULL(@Name, '') = '' SET @Name = '""' 
    IF ISNULL(@City, '') = '' SET @City = '""' 
    IF ISNULL(@Country, '') = '' SET @Country = '""' 

    SELECT TOP (@RowCount) 
     [i].* 
    FROM 
     [dbo].[Institutions] [i] 
    WHERE 
     ((NULLIF(@Name, '""') IS NULL OR FREETEXT([i].[InstitutionName], @Name)) 
     AND (NULLIF(@City, '""') IS NULL OR FREETEXT([i].[City], @City)) 
     AND (NULLIF(@Country, '""') IS NULL OR FREETEXT([i].[Country], @Country)) 
     AND 
     (
      NULLIF(@Name, '""') IS NOT NULL 
      OR NULLIF(@City, '""') IS NOT NULL 
      OR NULLIF(@Country, '""') IS NOT NULL) 
     ) 
END 

問題:私はInstitutionNameで結果を注文しようとしたが、その後、私が代わりにRANKを使用して考えました。より多くの研究の後、私はそれがFREETEXTTABLEを使用することが最善であることがわかった。現時点では、ほとんどの結果が常に複数の列に対して1つの文字列を検索することを話しているので、自分の状況をどのように処理するのがベストかはわかりません。

これはどのように動作するかは完全にはわかりませんが、最高の組み合わせがすべての列の検索でRANKになっていると思います。

これが可能な場合は、いくつかの例を示してください。

答えて

0

多くのテストの後、私はこの結果が好きだと思います。私はで、必要なものはcolumnInstitutionName)、他はLEFT OUTER JOINです。次に、ORDER BYのランクを組み合わせます。

可能な限り効率的かどうかはわかりません。誰かが入力を持っている場合は、私はいつもより多くのことを学びたいので、あなたから聞いて欲しいです。

ALTER PROCEDURE [Application].[usp_Institution_Search] 
    @RowCount INT = 100, 
    @Name NVARCHAR(255), 
    @City NVARCHAR(255), 
    @Country NVARCHAR(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF ISNULL(@Name, '') = '' SET @Name = '""' 
    IF ISNULL(@City, '') = '' SET @City = '""' 
    IF ISNULL(@Country, '') = '' SET @Country = '""' 

    SELECT TOP (@RowCount) 
     [i].* 
    FROM 
     [dbo].[Institutions] [i] 
     INNER JOIN FREETEXTTABLE([Institutions], [InstitutionName], @Name) AS [ft1] ON [ft1].[Key] = [i].[InstitutionId] 
     LEFT OUTER JOIN FREETEXTTABLE([Institutions], [City], @City) AS [ft2] ON [ft2].[Key] = [i].[InstitutionId] 
     LEFT OUTER JOIN FREETEXTTABLE([Institutions], [Country], @Country) AS [ft3] ON [ft3].[Key] = [i].[InstitutionId] 
    ORDER BY 
     [ft1].[Rank] + ISNULL([ft2].[Rank], 0) + ISNULL([ft3].[Rank], 0) DESC 
     , [i].[InstitutionName] ASC 
END 
関連する問題