【问题标题】:IF Inside WHERE with stored procedureIF 在 WHERE 内,带有存储过程
【发布时间】:2013-02-19 21:04:28
【问题描述】:

我有一个如下所示的 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,我需要对这些值进行一些计算。

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

【问题讨论】:

  • 你知道最后一行不同吗?它有一个“@Value5”混合在那里:[value6_id] = ISNULL(@Value5, [value6_id]))
  • @criticalfix 谢谢,但这无关紧要。我用假名替换了真实姓名。
  • 您找到解决问题的方法了吗?

标签: sql if-statement null where


【解决方案1】:

用例

"CASE 可以用在任何允许有效表达式的语句或子句中。例如,您可以在 SELECT、UPDATE、DELETE 和 SET 等语句中以及在 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 内吗?如果上述内容不正确,请提供一个清晰、简洁的示例。

【讨论】:

  • 我应该提到我尝试过这个,但 SQL 没有它。 IDE 仅在我开始输入时显示 CAST,如果 CASE 在那里,则会出现错误。我认为这与 CASE 与 AND 的组合有关。
  • 您有一个简化的示例供我们使用吗?我假设你在 SQL Server 上……你在用什么?伪代码示例将起作用
  • 我会尝试更多地使用 CASE,或者使用 CASE 发布代码,它会给出错误。
  • @J Lo 我正在使用 SQL Server。我对 CASE 的理解显然是错误的。似乎我看到的大多数示例都试图用 WHERE 和 CASE 分配一个值。我只是想执行两段不同的代码。 pastebin.com/caLukCuy 这就是我想要完成的任务。这显然是不正确的,我只是在记事本中快速写出来,以便您了解我要完成的工作。
【解决方案2】:

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

我认为这将很难做到,例如 WHERE 子句中的 CASE。在 SELECT 语句之外使用 IF 构造可能会更好:

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 以查看等效性。

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 2014-01-07
    • 2015-01-17
    • 2011-10-08
    • 2010-10-16
    • 2015-04-22
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    相关资源
    最近更新 更多