[英]How to conditionally add an AND condition to a WHERE clause in SQL Server
我有一个包含以下架构的表:
| ID | BUNDLE_ID | IS_ADMIN |
我需要根据某些标准从上表中选择具有AND子句的数据,即
IF @FLAG = 1
SELECT *
FROM TABLE A
WHERE A.IS_ADMIN = 1 AND BUNDLE_ID IN (3, 5)
ELSE
SELECT *
FROM TABLE A
WHERE A.IS_ADMIN = 1 AND BUNDLE_ID IN (1, 2)
我可以在一个查询中实现这一点吗?
一般方法是使用布尔表达式重写查询,该表达式根据flag的值计算您需要的值:
SELECT * FROM TABLE A WHERE A.IS_ADMIN = 1 AND ( -- Common part ...
(@Flag=1 AND BUNDLE_ID IN(3,5)) -- IF ...
OR
(@Flag<>1 AND BUNDLE_ID IN(1,2)) -- ELSE ...
)
是的,很简单。
SELECT *
FROM TABLE A
WHERE (A.IS_ADMIN = 1
AND BUNDLE_ID IN (3,5)
AND @FLAG = 1)
OR (A.IS_ADMIN = 1
AND BUNDLE_ID IN (1,2)
AND (@FLAG <> 1 OR @FLAG IS NULL))
只是:
SELECT *
FROM TABLE A
WHERE (A.IS_ADMIN = 1 AND BUNDLE_ID IN(3,5) AND @FLAG = 1)
OR (A.IS_ADMIN = 1 AND BUNDLE_ID IN(1,2) AND (@FLAG <> 1 OR @FLAG IS NULL))
您可以使用表驱动控件
SELECT A.* FROM TABLE A
INNER JOIN (VALUES (0,1),(0,2),(1,3),(1,5)) COND(FLAG,BUNDLE_ID)
ON A.BUNDLE_ID = COND.BUNDLE_ID
AND COND.FLAG = ISNULL(@FLAG,0)
WHERE
A.IS_ADMIN = 1
替代方案,仅仅因为......
SELECT * FROM a_table A WHERE @flag = 1 AND IS_ADMIN = 1 AND A.BUNDLE_ID IN (3, 5)
UNION ALL
SELECT * FROM a_table A WHERE @flag <> 1 AND IS_ADMIN = 1 AND A.BUNDLE_ID IN (1, 2)
应给出类似的执行计划......
SELECT
*
FROM
a_table AS A
CROSS APPLY
(
SELECT A.BUNDLE_ID WHERE @flag = 1 AND A.BUNDLE_ID IN (3, 5)
UNION ALL
SELECT A.BUNDLE_ID WHERE @flag <> 1 AND A.BUNDLE_ID IN (1, 2)
)
WHERE
A.IS_ADMIN = 1
与已经提供的其他答案不同的布局,但提供相同的逻辑......
WITH
admin AS
(
SELECT * FROM a_table A WHERE IS_ADMIN = 1
)
SELECT
*
FROM
admin
WHERE
(@flag = 1 AND BUNDLE_ID IN (3, 5))
OR (@flag <> 1 AND BUNDLE_ID IN (1, 2))
试试:
SELECT * FROM TABLE A
WHERE A.IS_ADMIN = 1 AND
(BUNDLE_ID IN (3,5) AND @FLAG = 1) OR
(BUNDLE_ID IN (1,2) AND @FLAG <> 1)
这也是完全有效的语法......
IF @FLAG = 1
BEGIN
SELECT * FROM TABLE A WHERE A.IS_ADMIN = 1 AND BUNDLE_ID IN(3,5)
END
ELSE
BEGIN
SELECT * FROM TABLE A WHERE A.IS_ADMIN = 1 AND BUNDLE_ID IN(1,2)
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.