2017-05-19 2 views
0

GOAL: um ein Ergebnis basierend auf einer Suche von 3 verschiedenen Spalten mit jeweils eigenen Suchzeichenfolgenwert und Reihenfolge von RANK, wenn möglich zurückgeben.SQL Server sucht mehrere Spalten mit FREETEXTABLE

REGELN:

  1. zulassen jede Spalte
  2. Ergebnisse must alle Suchzeichenketten auf ihren jeweiligen Spalte enthalten gesucht werden, es sei denn, null geben wird
  3. IF alle Suche Zeichenketten sind null, geben leere Ergebnisse zurück

Aktuelle gespeicherte Prozedur:

ich in der Lage war, mit dieser nach viel Forschung, um die von den oben gegebenen Regeln zu halten zu kommen.

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 

Probleme: Ich war über die Ergebnisse von InstitutionName zu bestellen, aber dann dachte ich über ein RANK stattdessen verwenden. Nach mehr Forschung fand ich, dass es am besten ist, FREETEXTTABLE zu verwenden. An diesem Punkt bin ich mir nicht sicher, wie ich am besten mit meiner Situation umgehen kann, da die meisten Ergebnisse immer davon reden, eine Zeichenfolge gegen mehrere Spalten zu suchen.

Ich bin mir nicht ganz sicher, wie das funktioniert, aber ich nehme an, ich möchte die höchste kombinierte RANK aus der Suche aller Spalten.

Wenn das möglich ist, zeigen Sie mir bitte einige Beispiele.

Antwort

0

Also nach vielen Tests denke ich, dass ich dieses Ergebnis mag. Ich bin INNER JOIN ing die erforderlichen column (InstitutionName) und LEFT OUTER JOIN in den anderen. Dann kombinieren Sie ihre Reihen in der ORDER BY.

Ich bin mir nicht sicher, ob es so effizient wie möglich ist. Wenn jemand etwas zu sagen hat, würde ich mich freuen, von Ihnen zu hören, denn ich möchte immer mehr erfahren.

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 
Verwandte Themen