2010-07-27 56 views
2

我想通過一個網站實現我們的數據庫的搜索功能。數據庫有一個主表和五個表,這些表都是外鍵的主表(詳細表)。詳細信息表保存掛鉤到應用程序中的查找表的可以爲空的整數值。我想允許用戶從查找表中選擇任何/所有值並將其作爲逗號分隔的字符串傳遞給存儲過程。我遇到的問題與記錄具有NULL值時有關,因爲它返回UNKNOWN,所以我沒有收到任何行。SQL:動態哪裏子句使用IN語句死於NULL值的記錄

這裏是什麼,我想在where子句中的例子:

Input Variable 
    @StateIDs VARCHAR(MAX) 

    @StateIDs = '1, 2, 3' //I have a split function to split this up 
    //@StateIDs could have zero or all 50 states in it so this needs to work with either 

    WHERE 
    State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ',')) 

    //udf_SplitAndCoalesce is used to split up the csv input parameter and if that is null to return the current value in the record in the table 

This works unless @StateIDs = NULL the where clause becomes 

    WHERE State.StateID IN (State.StateID) 

這是很好的,除非State.StateID = NULL則變得

WHERE State.StateID IN (NULL) 

這將返回UNKNOWN(無行)

如果csv列表中的@StateIDs爲空,那麼我真的不希望Where子句的那部分存在,但我不知道有條件地排除或包含整個語句的方式。最大的問題是大概有二十個不同的輸入是可能的,所以我不能只寫一個@StateIDs不爲空的兩個不同的選擇語句,而當它是一個時,它不是一個。

我最終試圖創建一個動態where子句,而不使用sp_executesql作爲字符串執行語句。

我一直在爲此工作了幾天,並創建了一堆不同的解決方案,但每個都不是我所需要的,它涉及到處理NULL。

任何幫助的人可以給我將不勝感激。

回答

2

你將不得不更新每個WHERE子句,但你可以做這樣的事情(注意WHERE子句被括號包圍)?

WHERE 
    (State.StateID IN (udf_SplitAndCoalesce(@StateIDs, State.StateID, ',')) 
     OR @StateIDs IS NULL) 

如果@StateIDs爲NULL,OR @StateIDs IS NULL條款將有效地返回所有的行,如果在報表是不存在的,因爲整個聲明將評估爲TRUE。