2

変数の値に基づいて変化する where 句にフィルターを追加する必要があるコードがあります。以下の例のように、@X の値が 0 の場合、OrderID = 10; のフィルターを含めたいと考えています。それ以外の場合は、OrderID = 20 のフィルターを追加し、DepartmentID の別のフィルターを NULL または値 30 に設定します。これは、以下のように IF ELSE を使用して実現できます。

DECLARE @X INT

-- Retrieve value for @X

IF @X = 0 
BEGIN
    SELECT *
    FROM Customers
    WHERE ProductID IS NOT NULL
    AND OrderID = 10
END
ELSE
BEGIN
    SELECT *
    FROM Customers
    WHERE ProductID IS NOT NULL
    AND OrderID = 20 AND ( DepartmentID IS NULL OR DepartmentID = 30)
END

1 つの SQL ステートメントを使用してそれを行う方法があるのだろうか。WHERE 内で CASE を使用して実行できると思いましたが、SQL では以下が許可されていないようです。

SELECT *
    FROM Customers
    WHERE ProductID IS NOT NULL
    AND CASE WHEN @X = 0 THEN OrderID = 10 ELSE OrderID = 20 AND ( DepartmentID IS NULL OR DepartmentID = 30) END

これを達成する方法はありますか。

4

3 に答える 3

4

あなたは近くにいた、

AND OrderID = (CASE WHEN @X = 0 THEN 10 ELSE 20 END)
AND DepartmentID = (CASE WHEN @X = 0 THEN DepartmentID ELSE 30 END)
于 2013-10-30T12:25:54.480 に答える
1

なしでそれを行うことができますCASE

SELECT *
FROM Customers
WHERE ProductID IS NOT NULL
AND ((@X = 0 AND OrderID = 10) OR (@X <> 0 AND OrderID = 20 AND DepartmentID = 30))

編集:

追加したい条件で:

SELECT *
FROM Customers
WHERE ProductID IS NOT NULL
AND ((@X = 0 AND OrderID = 10) OR (@X <> 0 AND OrderID = 20 AND (DepartmentID IS NULL OR DepartmentID = 30)))
于 2013-10-30T12:31:44.223 に答える
1
SELECT *
FROM Customers
WHERE ProductID IS NOT NULL
AND OrderID = CASE WHEN @X = 0 THEN 10 ELSE 20 END
AND ISNULL(DepartmentID,30) = CASE WHEN @X = 0 THEN ISNULL(DepartmentID,30)  ELSE 30 END
于 2013-10-30T12:31:59.627 に答える