2011-03-08 133 views
2

我有一個存儲過程,在這我要選擇具有USER_ID字段等於參數p_user_id一個表T的所有記錄中的所有記錄:SQL - 選擇具有字段集或空

SELECT * FROM T WHERE user_id = p_user_id; 

但如果參數是NULL(或者如果你願意的話),我想要所有的記錄。 也就是說,我無法想象WHERE子句中的CASE。

回答

2
SELECT * FROM T 
WHERE user_id = p_user_id 
OR p_user_id is null 
OR p_user_id = 0 

應該工作。

這裏子句user_id = p_user_id將等同於UNKNOWN如果p_user_id爲空,其在大多數數據庫將具有不匹配任何行(sybase是一個例外)的結果。

+0

「如果p_user_id爲空,則子句user_id = p_user_id將始終爲假「 - 否,它應該是UNKNOWN,並且區分至關重要。如果它是FALSE,那麼除非明確處理,否則每個CHECK約束都會拒絕NULL值。 – onedaywhen 2011-03-08 09:59:51

+0

...在您自己發佈的鏈接中清楚地陳述了這一點:「只有返回值爲TRUE的列才被選中或導致指定的操作;返回FALSE或UNKNOWN的列不會......一般來說,因爲不可能確定NULL是否等於(或不等於)給定值或另一個NULL,所以比較空值是UNKNOWN。「 – onedaywhen 2011-03-08 10:02:31

+0

@onedaywhen謝謝,根據您的建議進行了修改。 – krock 2011-03-08 10:14:31

2
SELECT * FROM T WHERE user_id = p_user_id or p_user_id is null or p_user_id = 0; 
0

SELECT * FROM T WHERE user_id = @p_user_id OR @p_user_id IS NULL

的或當參數爲NULL子句是真實的(NULL IS NULL == TRUE)

0

如果我理解正確的話,你想這樣:

IF p_user_id IS NULL 
    (SELECT * FROM T); 
ELSE 
    (SELECT * FROM T WHERE user_id = p_user_id)