2017-02-28 23 views
0

特定の型のパラメータを提供するユーザーに基づいて結果を取得できるストアドプロシージャがあります。ユーザーはnullパラメータを指定することもできます。この場合、すべての結果が返され、フィルタは無視されます。ここでNullable列のSQL LEFT OUTER JOINと結合の使用

は、ストアドプロシージャです:

CREATE PROCEDURE GetHousesByType 
(
    @HouseTypeParameter INT = NULL, 
) 
AS 
BEGIN 

SELECT HouseId, HouseType, HouseName 
FROM HouseTable MAIN 
LEFT JOIN HouseTypes HOTP ON MAIN.HouseType = HOTP.HouseTypeId 
WHERE MAIN.HouseType = COALESCE(@HouseTypeParameter, MAIN.HouseType) 

問題は時々私が参加HouseType列がnullになることができるということです。

HouseType列がnullの場合でも、しかし@HouseTypeParameterがNULLである場合にのみ、私はすべての列を返したい

アイブ氏は、クエリ

WHERE MAIN.HouseType = COALESCE(HouseType, MAIN.HouseType) OR MAIN.HouseType IS NULL 

の条件に以下を追加してみました


しかしこれは、ユーザがHouseTypeパラメータをどのように設定してもnull値を取得します。

助けがあれば助かります。

+0

テーブルの 'HouseType'列は' NULL'でもかまいませんか? – Lamak

+0

ごめんなさい、ラマックの良い点。質問を更新しない –

答えて

1

私は何かが欠けていない限り、句はあなたのために働くべきところ、この:

WHERE MAIN.HouseType = COALESCE(@HouseTypeParameter, MAIN.HouseType) 
OR (MAIN.HouseType IS NULL AND @HouseTypeParameter IS NULL) 
1

あなたはケースにHouseTypeに架空の値を使用することができ、それはNULLです:

WHERE COALESCE(MAIN.HouseType,-1) = COALESCE(@HouseTypeParameter, MAIN.HouseType, -1); 

それとも単に使用OR

WHERE MAIN.HouseType = @HouseTypeParameter 
OR @HouseTypeParameter IS NULL; 
0

私はこれがあなたのものだと思いますant

SELECT HouseId, HouseType, HouseName 
FROM HouseTable MAIN 
LEFT JOIN HouseTypes HOTP ON MAIN.HouseType = HOTP.HouseType 
WHERE MAIN.HouseType = @HouseTypeParameter 
    OR (MAIN.HouseType IS NULL AND @HouseTypeParameter IS NULL); 
関連する問題