我有一个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,我需要对值运行一些计算。
关于最佳行动的任何想法?
答案 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 以查看等效性。