2010-01-21 34 views
1

我試着問過這個問題,但我不認爲我解釋得很好。所以這裏是:asp.net 2.0應用程序擊中SQL 2008後端。這看起來很簡單,但我無法得到它。 1桌。用戶選擇一個狀態。查詢應只返回所有記錄=僅選擇的狀態。如果用戶選擇「所有狀態」,則應返回所有記錄,包括那些status = null(這是打我的部分)的記錄。SQL查詢... nulls hoses me

例:

CASE 1:用戶選擇狀態= 「滿意」;僅僅滿足記錄返回

案例2:用戶選擇返回所有的狀態=一切,滿意,空值和其他任何

我在一個通配符試圖P將但這不返回空值。我試圖動態地修改查詢,但我想避免它。

回答

4
SELECT * FROM <tablename> WHERE Status = '*' OR Status IS NULL 

...或'%'或SQL實現使用的任何通配符。

...或者,如果你真的有以下這個沒有其他條件,只是select *...

0

只跳過where子句,或者是關於狀態字段,例如部分:

SELECT *從哪裏TABLE_1狀態=「滿意」 和TABLE_1

0

SELECT * FROM <tablename> WHERE isnull(Status,'*') = '*'

0

當你想要的所有記錄 SELECT *,你必須排除喲狀態您的WHERE子句(或使用UNION和STATUS爲空的select語句)。

根據您使用的SQL版本,您可能可以使用IF..ELSE ...語句。

IF狀態=「ALL」,那麼 ...其中狀態不包含在SELECT語句的WHERE

ELSE ......,有一個WHERE只有你正在尋找狀態的SELECT語句

1

問題是,當其中一個操作數是NULL時,SQL的=運算符總是返回NULL,因此使用status = '%'確實不起作用。最好的方法是隻在status的條件下不包含全部。您可以添加額外的NULL測試查詢,但再次被動態地建設中,但我不明白的方式,以避免...

0

假設你傳遞一個變量到SP:

SELECT * FROM Table WHERE Status CASE @status WHEN 'All status' THEN Status ELSE @status END 

否則,您需要在兩個地方引號內將選擇值來連接目前它說@status

2

在存儲過程試試這個。

--Pass in @status as a parameter 
DECLARE @Status varchar(100) 

IF @Status = 'All Status' 
BEGIN 
    SELECT * FROM tablename 
END 
ELSE 
BEGIN 
    SELECT * FROM tablename where statusfield = @Status 
END 
3

對於你想要他們所有人的情況,怎麼樣:(我錯過了什麼?)

SELECT * FROM <tablename> 
0

這個想法是當用戶選擇'所有狀態'時要做什麼。通過將參數設置爲NULL,可以使用isnull,然後每個[status]字段只需要自己相等。我用ISNULL設置爲「」以避免NULL = NULL>

declare @param_choice varchar(25) 

if @param_choice = 'All Status' 
    Begin 
    @param_choice = NULL 
    End 

-- get your results 
Select * from Some_Table 
Where IsNull([Status], '') = IsNull(@param_choice, IsNull([Status], '')) 
2

一種選擇是

declare @status varchar(50) 

SELECT * FROM <tablename> WHERE (@status is null) or (Status = @status) 

,如果你在爲@status參數傳遞null,則它會返回所有記錄。如果您通過「滿意」或其他方式,那麼它將只返回那些matchng記錄。

如果在SQL 2008中這樣做,請確保安裝了SP1和累積更新5。此外,我會建議在該過程中添加WITH RECOMPILE選項。在這些條件下,它將與嵌入式SQL或甚至使用聯合一樣具有性能。

參見執行2008年SQL搜索的方式無數的深入討論下面的文章:Dynamic Search Conditions in T-SQL

1

基本上你的聲明將是 'Statisfied'

SELECT * FROM TESTTAB WHERE COALESCE(statuscolumn, '')LIKE '%分層'

爲 '所有狀態' 這將是

SELECT * FROM WHERE TESTTAB COALESCE (statuscolumn, '')LIKE '%'

你可以使用這個statment,如果選擇 '所有狀態',然後通過一個'從@status你的UI

SELECT * FROM WHERE TESTTAB COALESCE (statuscolumn, '')LIKE '%' || @status

或者你可以用這一個,當你通過從UI選擇確保它附加到您的狀態時,它不是「全狀態」一個「%」(野生字符)。當它的 '全狀態' 只是通過 '%' 爲@status

SELECT * FROM WHERE TESTTAB COALESCE (statuscolumn, '')LIKE @status

哦,你的數據庫是MSSQL? :)那麼你將需要用isnull(statuscolumn,'')替換collace(statuscolumn,'')。

0

你會得到最好的性能:

IF @status IS NULL 
    BEGIN 

    SELECT t.* 
     FROM TABLE t 

    END 
ELSE 
    BEGIN 

    SELECT t.* 
     FROM TABLE t 
    WHERE t.status = @status 

    END 

下一個選項是使用:

SELECT t.* 
    FROM TABLE t 
WHERE (@status IS NULL OR t.status = @status) 

...但是,這是不是可優化搜索。

0

我不相信有人建議使用UNION。

SELECT t.* 
    FROM TABLE t 
WHERE (@status IS NULL) 

UNION ALL 

SELECT t.* 
    FROM TABLE t 
WHERE (t.status = @status) 

如果@status爲NULL,則執行在聯盟第一查詢,t.status = @status顯然總是假的,所以根本沒有執行在聯盟第二查詢。

如果@status不爲空,那麼聯合中的第一個查詢根本就沒有被執行,而第二個查詢是。

重要的是,由於ISNULL,COALESCE或函數沒有在t.status或@status上使用,因此如果在狀態上有索引,可以使用它。也就是說,謂詞是SARGABLE。

而且我使用UNION ALL(而不是UNION)來防止可能非常緩慢的SORT和DISTINCT操作。