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
或直接在带有OR
的WHERE
子句中:
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] IF ELSE 和 CASE WHEN 的用法
SQL Server IF..ELSE 不在 Windows 应用程序中显示
sql server 语法,有如下一段代码,两个if一块只有一个else,程序怎么走?