1

この質問は、複数のID値を受け入れるT-SQLストアドプロシージャの最後の回答の補遺になります

ストアドプロシージャにパラメータとしてIDのリストをいくつか渡します。データが送信されない場合、それぞれのデフォルトはnullになります。たとえば、ストアドプロシージャによってIDが1、2、5、7、20の食品が返されるようにします。また、カラーIDと製造場所IDのリストを送信します。これらのIDのコンマ区切りリストを渡します。上記の質問の最後の回答と同様に、各パラメーターのデータを使用して一時テーブルを作成します。次に、次のようなselectステートメントが必要です。

SELECT * FROM Candies 
INNER JOIN #TempColors 
    ON Candies.ColorsID = #TempColors.ColorID 
INNER JOIN Locations 
    ON Candies.LocationID = Locations.LocationID

これは、パラメーターが入力され、LEFTOUTERJOINSが適切にフィルター処理されない場合にのみ機能します。nullを有効なパラメータとして受け入れながらフィルタリングする方法は何ですか?

4

1 に答える 1

1

あなたが使用することができます

some join condition OR @param IS NULL

あなたの結合では、nullが指定された場合、すべての結果が返されます-ただし、nullが渡されたときに必要な動作を指定していないことがわかります

(paramと言うときは、携帯電話でこれを行う一時テーブルの列を意味しますが、簡単ではありません;))

編集:

これは私のために働いた:

http://sqlfiddle.com/#!3/c7e85/26

例えば

-- Assume this is your values string which is populating the table
DECLARE @Values varchar(50)

-- Your code to populate the table here: assume the string is NULL when no values are passed
INSERT INTO #TempColors BLAH BLAH...

-- Select statement
SELECT * FROM Candies  
    LEFT JOIN #TempColors  
        ON Candies.ColorsID = #TempColors.ColorID
WHERE 1 = CASE 
              WHEN Candies.ColorsID IS NULL AND @Values IS NULL THEN 1
              WHEN Candies.ColorsID IS NOT NULL AND @Values IS NOT NULL THEN 1
              ELSE 0
          END

このように、NULL は NON-NULL パラメータで除外されますが、NULL パラメータでは保持されます。

于 2012-07-09T19:50:51.507 に答える