2010-02-25 10 views
3

J'ai une recherche ui avec 3 tous les critères de recherche optionnels. 2 d'entre eux sont des critères simples pour une instruction where, que je devrais pouvoir résoudre avec ceci: Stored Procedure with optional "WHERE" parameters.TSQL: requête avec jointure optionnelle

Le dernier critère est l'utilisation de la recherche en texte intégral lorsque je rejoins le résultat de ContainsTable. Y at-il un truc que je peux utiliser pour tout mettre dans une procédure stockée? Ou devrais-je faire deux requêtes, une avec la recherche en texte intégral et une sans?

Edité: Je aurais dû mettre ma question ici aussi, désolé ici, il est

select Table1.* from Table1 
join 
(
select [Key], SUM(Rank) as Rank from 
(
    SELECT [Key], Rank*3 as Rank FROM Table1ShortSearch(@Keywords) union all 
    SELECT [Key], Rank*2 as Rank FROM Table1LongSearch(@Keywords) 
) as RankingTbl 
group by [Key] 
) as r 
on Table1.Id = r.[Key] 

where (@Status_Id Is Null Or Status_Id = @Status_Id) 

order by r.Rank Desc 

Merci.

Répondre

2

Réponse d'origine:

Vous pouvez utiliser une fonction EXISTE comme ceci:

Select .. 
From .. 
Where (@Status_Id Is Null Or Status_Id = @Status_Id) 
And (@Date Is Null Or [Date] = @Date) 
And (@Criteria Is Null Or Exists(
     Select 1 
     From ContainsTable(TableName, Column1,...,ColumnN, @Criteria..) As SearchTable1 
     Where SearchTable1.PK = OuterTable.PK 
     )) 

Après révision de la question:

La requête révisée est de une nature complètement différente de la requête originale. Dans la requête d'origine, vous vouliez simplement renvoyer les résultats de Table1 et filtrer ces résultats de plus si @Keywords n'était pas null. Dans cette requête, vous publiez dans la clause SELECT le classement du texte. Qu'est-ce qui s'afficherait pour le classement si @Keywords était passé comme nul?

Si le classement FreeText n'est pas nécessaire et que vous voulez simplement retourner des résultats si l'une des recherches sur @Keywords trouve quelque chose, alors vous feriez quelque chose comme:

Select ... 
From Table1 
Where (@Status_Id Is Null Or Status_Id = @Status_Id) 
    And ... 
    And (
     @Keywords Is Null 
     Or Exists (
        Select 1 
        From Table1ShortSearch(@Keywords) As T1 
        Where T1.Key = Table1.Key 
        ) 
     Or Exists (   
        Select 1 
        From Table1LongSearch(@Keywords) As T2 
        Where T2.Key = Table1.Key 
        ) 
     ) 

Si vous souhaitez afficher le classement FreeText alors votre requête d'origine ou peut-être un CTE serait la solution mais vous devrez utiliser une jointure à gauche dans votre sous-requête si vous voulez rendre compte de @Keywords étant nul. Cela ferait votre requête lire:

Select ... 
From Table1 
    Left Join (
       Select [Key], Sum(Rank) as Rank 
       From (
         Select [Key], Rank*3 As Rank 
         From Table1ShortSearch(@Keywords) 
         Union All 
         Select [Key], Rank*2 As Rank 
         From Table1LongSearch(@Keywords) 
         ) As RankingTbl 
       Group By [Key] 
       ) as R 
     On R.[Key] = Table1.Id 
Where (@Status_Id Is Null Or Status_Id = @Status_Id) 
    And ... 
    And (@Keywords Is Null Or R.Key Is Not Null) 
Order By R.Rank Desc 
+0

Salut J'ai posté ma requête, pouvez-vous le modifier et me montrer comment je devrais utiliser les Exists? Merci – Karsten