2

次のような WHERE ステートメントがあります。

WHERE 
    ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Value1, [value1_id]))
    AND
    ((@Value2 IS NULL AND [value2_id] IS NULL) OR [value2_id] = ISNULL(@Value2, [value2_id]))
    AND
    ((@Value3 IS NULL AND [value3_id] IS NULL) OR [value3_id] = ISNULL(@Value3, [value3_id]))
    AND
    ((@Value4 IS NULL AND [value4_id] IS NULL) OR [value4_id] = ISNULL(@Value4, [value4_id]))
    AND
    ((@Value5 IS NULL AND [value5_id] IS NULL) OR [value5_id] = ISNULL(@Value5, [value5_id]))
    AND 
    ((@Value6 IS NULL AND [value6_id] IS NULL) OR [value6_id] = ISNULL(@Value5, [value6_id]))

Value5 と Value6 で特別なことを実行できるように、WHERE 内に条件付きロジックを追加する必要があります。基本的にValue5やValue6などの値がnullの場合、Value5やValue6の行をそのまま使いたいと思っています。3 つの値がすべて NULL でない場合は、値に対していくつかの計算を実行する必要があります。

最善の行動は何かについてのアイデアはありますか?

4

2 に答える 2

4

使用事例

「CASE は、有効な式を許可する任意のステートメントまたは句で使用できます。たとえば、SELECT、UPDATE、DELETE、SET などのステートメント、および select_list、IN、WHERE、ORDER BY などの句で CASE を使用できます。持っている。」

http://msdn.microsoft.com/en-us/library/ms181765.aspx

SELECT次のように 内で計算を実行できます。

SELECT
    CASE
        WHEN @Value7 is not null THEN @Value7 * 100
        ELSE Value7 * 100
    END
FROM #T
WHERE   (@Value1 is null and Value1 is null)
    AND (@Value2 is null and Value2 is null)

正確に何を達成しようとしているのかはまだはっきりしていません。は のWHERE中ではありませんSELECTか? 上記が正しくない場合は、明確で簡潔な例を提供してください。

于 2013-02-19T21:09:49.573 に答える
1

基本的にValue5やValue6などの値がnullの場合、Value5やValue6の行をそのまま使いたいと思っています。3 つの値がすべて NULL でない場合は、値に対していくつかの計算を実行する必要があります。

これは、たとえば節のCASE中で行うのは難しいと思います。ステートメントの外側で構造WHEREを使用したほうがよい場合があります。IFSELECT

IF (@Value5 IS NULL OR @Value6 IS NULL OR @OtherValue IS NULL)
  BEGIN
    <Statement1AsIs>
  END
ELSE
  BEGIN
    <Statement2WithComputations>
  END

WHERE句を書き換える

短い補足として、あなたがそれを求めていないことは知っていますが、これらを書くための「より明確な」方法があるに違いないと感じています

((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Value1, [value1_id]))

私は少し遊んでいますが、これは同じことを言う1つの方法です:

COALESCE(@Value1, [value1_id], 1001) = COALESCE([value1_id], 1001)

これは別のもので、同等で短いものです:

@Value1 IS NULL OR [value1_id] = ISNULL(@Value1, [value1_id])

このSQL Fiddleをチェックして、同等性を確認してください。

于 2013-02-19T22:11:56.650 に答える