如果在WHERE内部存储过程

时间:2013-02-19 21:04:28

标签: sql if-statement null where

我有一个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,我需要对值运行一些计算。

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

2 个答案:

答案 0 :(得分:4)

使用CASE

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

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内吗?如果上述内容不正确,请提供简明扼要的示例。

答案 1 :(得分:1)

  

基本上,如果Value5,Value6或其他值为null,我想使用   Value 5和Value 6行原样。如果所有三个值都不为NULL,   我需要对值进行一些计算。

我认为这很难用例如CASE子句中的WHERE。使用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 以查看等效性。