2011-03-08 7 views

答えて

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

p_user_idがで最もデータベースは任意の行(sybaseは例外ですが)一致しない結果になりますどのnullの場合はここで

user_id = p_user_idはUNKNOWNに同一視されます。

+0

をp_user_idがnullの場合、user_id = p_user_id節は常にfalseになります。 " - いいえ、UNKNOWNでなくてはならず、区別が重要です。もしそれがFALSEなら、全ての 'CHECK'制約は、明示的に処理されない限り、' NULL'値を拒絶するでしょう。 – onedaywhen

+0

...これはあなた自身が投稿したリンクにはっきりと明記されています: "TRUEの値を返す列のみが選択されたり、指定された動作になります; FALSEまたはUNKNOWNを返す列はありません... NULLが指定された値または別のNULLと等しいかどうかを判別することは不可能であるため、NULL値の比較はUNKNOWNです。 – onedaywhen

+0

@onedaywhenありがとうございました。あなたの提案に基づいて改訂しました。 – krock

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

OR句のパラメータが(NULL IS NULL == TRUE)NULLのとき真である

0

私が正しく理解していれば、あなたはこの希望: "

IF p_user_id IS NULL 
    (SELECT * FROM T); 
ELSE 
    (SELECT * FROM T WHERE user_id = p_user_id) 
関連する問題