SQL WHERE 子句中的 IF 语句

Posted

技术标签:

【中文标题】SQL WHERE 子句中的 IF 语句【英文标题】:IF statement in SQL WHERE clause 【发布时间】:2013-05-21 12:48:02 【问题描述】:

是否可以将值传递给存储过程以告诉它是否将 OR 语句附加到 SQL SELECT 语句?

我尝试过类似的方法,但它无效:

SELECT xyzName
FROM xyz_fields
WHERE (xyzType = 'this') UNION ALL
(if @status=1 OR (xyzType = 'that')) UNION ALL
(if @status2=1 OR (xyzType = 'somethingelse'))

有点像在 SQL 中构建 WHERE 子句,而不是从应用程序再次访问数据库?

【问题讨论】:

尝试用例语句。请发布您拥有的数据以及您需要的输出.. 您必须更具体...您的查询没有意义,问题也令人困惑... 【参考方案1】:

我认为你的意思是这样的:

SELECT xyzName
FROM xyz_fields
WHERE (xyzType = 'this') 
OR (@status=1 AND (xyzType = 'that')) 
OR (@status2=1 AND (xyzType = 'somethingelse'))

where 子句的第二行仅在 @status 等于 1 且 xyzType 等于 'that' 时才提供成功。

【讨论】:

【参考方案2】:

您可以为此使用动态 SQL。

declare @SqlQuery varchar(100)

Set @SqlQuery = ' SELECT xyzName FROM xyz_fields WHERE  xyzType = ''this'' '

if(@status=1)
Set @SqlQuery = @SqlQuery + ' OR xyzType = ''that'' '

if(@status2=1)
Set @SqlQuery = @SqlQuery + ' OR xyzType = ''somethingelse'''

exec(@SqlQuery) 

查询中的单个 qoutes 通过添加另一个单个 qoute 的前缀来转义。 所以在查询中

WHERE  xyzType = 'this' 

应该是

WHERE  xyzType = ''this''

【讨论】:

看来这可能是一个不错的方法,如果正确,我会试一试并标记为答案。为努力+1,谢谢! 更新:这似乎运作良好,非常感谢发布此解决方案。 如果你打算使用动态 SQL,你应该对多个查询使用UNION ALL,而不是ORs。您通常会获得更好的查询计划。例如,SELECT * FROM A WHERE 'X' UNION ALL SELECT * FROM B WHERE 'Y' 使用 OR 而不是动态 SQL 的解决方案要好得多。您可以使用动态 sql 添加不需要的安全问题。 你的应用程序是用什么写的?可能有更好的方法来做到这一点。【参考方案3】:
SELECT xyzName
FROM xyz_fields
WHERE (xyzType = 'this')
OR ((xyzType = 'that') AND @status = 1)
OR ((xyzType = 'somethingelse') AND @status2 = 1)

@status = 1((xyzType = 'that') AND @status = 1) 返回(xyzType = 'that'), 但是当@status = 0,((xyzType = 'that') AND @status = 1)返回false时不会影响你的查询。

【讨论】:

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

简述SELECT语句中的FROM、WHERE以及ORDER BY子句的作用。SQL Server

where 子句中的 case 语句 - SQL Server

mysql语句where条件中的是啥意思

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

是否可以使用“WHERE”子句来选择 SQL 语句中的所有记录?

具有另一个 sql 语句的 where 子句中的 case 条件