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]))

我需要在 WHERE 中添加一些条件逻辑,以便我可以使用 Value5 和 Value6 做一些特殊的事情。基本上,如果 Value5、Value6 或其他值为 null,我想按原样使用 Value 5 和 Value 6 行。如果所有三个值都不为 NULL,我需要对这些值进行一些计算。

关于最佳行动的任何想法?

4

2 回答 2

4

使用案例

"CASE 可用于任何允许有效表达式的语句或子句。例如,您可以在 SELECT、UPDATE、DELETE 和 SET 等语句中以及在 select_list、IN、WHERE、ORDER BY 和有。”

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,我想按原样使用 Value 5 和 Value 6 行。如果所有三个值都不为 NULL,我需要对这些值进行一些计算。

我认为这很难做到,例如CASEWHERE子句内部。在语句IF之外进行构造可能会更好:SELECT

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]))

我一直在玩,这是一种说法:

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 回答