SQL Server:IF .. ELSE 中的 Where 子句

Posted

技术标签:

【中文标题】SQL Server:IF .. ELSE 中的 Where 子句【英文标题】:SQL Server : Where clause inside IF .. ELSE 【发布时间】:2014-02-11 21:40:34 【问题描述】:

就像已经解释过的标题一样,我正在为我的 SQL 存储过程中的 WHERE 子句而苦苦挣扎。

我得到了一个 SELECT 查询,它很好地连接了多个表,最后如果得到一个 WHERE 子句,它给出了要搜索的特定值。

我的问题是我想为 2 个不同的 WHERE 子句扩展这个存储过程,但我的 IF ELSE 无法正确解析查询。

例如:

SELECT ....... 
FROM TABLE_X
INNER JOIN TABLE_Y.....
WHERE 
    man.Klant_ID = @Klant
    AND (@ManID = 0 OR man.ID = @ManID)
    AND .... (which continues like the rule above)

在这里我想得到这样的东西:

SELECT ....... 
FROM TABLE_X
INNER JOIN TABLE_Y.....

IF @TEMPVAR = ''
    WHERE man.Klant_ID=@Klant
    AND (@ManID = 0 OR man.ID = @ManID)
    AND... 
ELSE
    WHERE TABLE_X.ID IN (@TEMPVAR)

(和@tempvar 应该包含逗号分隔的ID,如10001,10002,10003

我在语法上苦苦挣扎,搜索了一段时间,但似乎找不到合适的解决方案。

提前致谢!

【问题讨论】:

这可能会有所帮助***.com/questions/10191424/case-in-where-sql-server 很简单......你不能那样做......你需要把整个select子句放在你的IF ELSE中...... 在编写 SQL 时,不要将IF/ELSE 控制结构视为构建 SQL 语句的机制。相反,与查询返回的结果相关的任何逻辑都应内置到其WHERE 子句中,并且可以在其中使用变量,就像在函数或存储过程的范围内一样。 尝试在 IF 语句之间使用 BEGIN 和 END 语句。 technet.microsoft.com/en-us/library/ms182717.aspx 我用更多信息更新了我的问题..我的原始位置..逻辑已经像这里的第一个给出的评论。 【参考方案1】:

您可以通过 CASE 做到这一点:

SELECT ....... FROM TABLE_X
INNER JOIN TABLE_Y.....
WHERE TABLE_X.FIRSTCOLUMN = 
    CASE WHEN @TEMPVAR = '' THEN 123
         ELSE 456
    END

或直接在带有ORWHERE 子句中:

WHERE (@TEMPVAR = ''
       AND man.Klant_ID=@Klant
       AND (@ManID = 0 OR man.ID = @ManID)
       AND... 
      ) 
      OR
      (@TEMPVAR <> '' 
       AND TABLE_X.ID IN (@TEMPVAR)
      )

【讨论】:

这确实是一个问题的正确解决方案。但我有点解释错了我的问题。我已经更新了我的问题。但我很感激你的努力! 这确实像我希望的那样完美地分开了条款,所以我会接受你的回答!额外的问题:@Tempvar 我想包含逗号分隔的 id 以使用,例如:.. where ID IN (@TEMPVAR) (would be WHERE ID IN (10001,10002,10003)) .. 我怎么能让这成为可能?现在我将 TempVar 声明为 'nvarchar(max)' 因为它包含逗号到.. 这并不简单——您要么需要使用 dynaimc SQL(构建一个字符串并附加逗号分隔列表),要么构建一个函数将字符串拆分为一个临时表并加入它。见here 好的,非常感谢您的时间!也会看看这个解决方案来解决我的问题!【参考方案2】:

您可以通过where 中的直接逻辑来执行此操作:

SELECT ....... FROM TABLE_X
INNER JOIN TABLE_Y.....
WHERE TABLE_X.FIRSTCOLUMN = 123 and @TEMPVAR = '' or
      TABLE_X.FIRSTCOLUMN = 456 and @TEMPVAR <> ''

如果TEMPVAR 可以是NULL,那么:

SELECT ....... FROM TABLE_X
INNER JOIN TABLE_Y.....
WHERE TABLE_X.FIRSTCOLUMN = 123 and @TEMPVAR = '' or
      TABLE_X.FIRSTCOLUMN = 456 and (@TEMPVAR <> '' or @TEMPVAR is null)

【讨论】:

【参考方案3】:

另一种方法是:

IF @TEMPVAR = ''
SELECT ....... FROM TABLE_X
INNER JOIN TABLE_Y.....
WHERE TABLE_X.FIRSTCOLUMN = 123
    AND ....
ELSE
SELECT ....... FROM TABLE_X
INNER JOIN TABLE_Y.....
WHERE TABLE_X.FIRSTCOLUMN = 456
    AND ....

【讨论】:

以上是关于SQL Server:IF .. ELSE 中的 Where 子句的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中的流控制语句

[SQL server] IF ELSE 和 CASE WHEN 的用法

SQL Server IF..ELSE 不在 Windows 应用程序中显示

sql server 语法,有如下一段代码,两个if一块只有一个else,程序怎么走?

SQL Server判断语句(IF ELSE/CASE WHEN )

SQL Server判断语句(IF ELSE/CASE WHEN )