原來的答案:
您可以使用EXISTS功能,像這樣:
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
))
後問題修訂:
修改後的查詢是與原始查詢完全不同的性質。在原始查詢中,只需要返回Table1的結果,並在@Keywords不爲空的情況下過濾這些結果。在這個查詢中,您正在向SELECT子句輸出自由文本排名。如果將@Keywords作爲空值傳遞,那麼會爲排名顯示什麼?
如果不需要自由文本排名和你只是想返回的結果,如果無論是在@Keywords的搜索找到的東西,那麼你會做這樣的事情:如果你想顯示的自由文本排名
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
)
)
那麼您的原始查詢或CTE可能是解決方案,但是如果您想要將@Keywords作爲空值,則需要使用左連接到子查詢。這將使您的查詢讀取:
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
嗨我postede我的查詢,你可以修改它並告訴我應該如何使用存在?謝謝 – Karsten 2010-02-26 08:41:20