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
,而不是OR
s。您通常会获得更好的查询计划。例如,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
SQL Server:IF .. ELSE 中的 Where 子句