我在網站中實現了一種搜索機制,並偶然發現了它的SQL方面。如何有條件地加入表格?
用戶可以通過這些過濾器的任意組合搜索故事:故事標題,故事標籤或故事作者的用戶名。如果未提供過濾器,則只返回所有故事。
我立即解決,這是此存儲過程:
(
@TitleFilter varchar(50) = NULL
,@TagFilter varchar(30) = NULL
,@UserFilter varchar(30) = NULL
)
SELECT
story.Title
,story.AddedDTS
FROM
Stories story
INNER JOIN FREETEXTTABLE(Stories, Title, @TitleFilter) ft
ON ft.[key] = story.ID
LEFT JOIN StoryTags st
ON st.StoryID = story.ID
LEFT JOIN Tags tag
ON tag.ID = st.TagID
LEFT JOIN StoryUser su
ON su.StoryID = story.ID
LEFT JOIN Users u
ON u.ID = su.UserID
WHERE
1=1
AND (
(@TagFilter IS NULL AND @UserFilter IS NULL)
OR (@TagFilter IS NOT NULL AND tag.Name = @TagFilter)
OR (@UserFilter IS NOT NULL AND u.Username = @UserFilter)
)
有一對夫婦的問題,這一點,雖然,我還沒有找到一個更好的方法。
首先,在Stories
表啓用了全文搜索,所以我必須使用FREETEXTTABLE
機制,強制要求謂語不NULL
,所以這個存儲過程不會@TitleFilter
組工作NULL
。其次,如果我只按標題搜索,那麼加入StoryTags
,Tags
,StoryUsers
和Users
表格只是一個無用的開銷。
所以問題是我說的兩點:我可以有條件地省略連接來優化執行時間嗎?
如果還有一個完全不同的方法,歡迎您分享它;我主張開箱即用。
LOL其實都得罪我=) 如果我使用'IF'聲明,我必須有一個條件對於每種可能的過濾器組合(例如,您的ELSE不會按照其他過濾器的標題進行過濾)。 而動態SQL是我最後一個解決這個問題的手段;我很想找到一些不那麼邪惡的東西。 – BeemerGuy 2011-05-19 20:59:09
我給你的答案 - 我使用了「IF-ELSE」和參數化動態SQL的組合,指的是鏈接中的樣本。謝謝。 – BeemerGuy 2011-05-20 14:39:27