我有一個存儲過程,在這我要選擇具有USER_ID字段等於參數p_user_id一個表T的所有記錄中的所有記錄:SQL - 選擇具有字段集或空
SELECT * FROM T WHERE user_id = p_user_id;
但如果參數是NULL(或者如果你願意的話),我想要所有的記錄。 也就是說,我無法想象WHERE子句中的CASE。
我有一個存儲過程,在這我要選擇具有USER_ID字段等於參數p_user_id一個表T的所有記錄中的所有記錄:SQL - 選擇具有字段集或空
SELECT * FROM T WHERE user_id = p_user_id;
但如果參數是NULL(或者如果你願意的話),我想要所有的記錄。 也就是說,我無法想象WHERE子句中的CASE。
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是一個例外)的結果。
SELECT * FROM T WHERE user_id = p_user_id or p_user_id is null or p_user_id = 0;
SELECT * FROM T WHERE user_id = @p_user_id OR @p_user_id IS NULL
的或當參數爲NULL子句是真實的(NULL IS NULL == TRUE)
如果我理解正確的話,你想這樣:
IF p_user_id IS NULL
(SELECT * FROM T);
ELSE
(SELECT * FROM T WHERE user_id = p_user_id)
「如果p_user_id爲空,則子句user_id = p_user_id將始終爲假「 - 否,它應該是UNKNOWN,並且區分至關重要。如果它是FALSE,那麼除非明確處理,否則每個CHECK約束都會拒絕NULL值。 – onedaywhen 2011-03-08 09:59:51
...在您自己發佈的鏈接中清楚地陳述了這一點:「只有返回值爲TRUE的列才被選中或導致指定的操作;返回FALSE或UNKNOWN的列不會......一般來說,因爲不可能確定NULL是否等於(或不等於)給定值或另一個NULL,所以比較空值是UNKNOWN。「 – onedaywhen 2011-03-08 10:02:31
@onedaywhen謝謝,根據您的建議進行了修改。 – krock 2011-03-08 10:14:31