SQL:如何根据传递的参数有条件地调整WHERE子句,并且仍然使用UNION
我对SQL相当缺乏经验。我正在使用SQL Server 2012 基本上,我希望根据传递给存储过程的某些参数的值来调整SQL SELECT语句的WHERE子句 我还将把这个SELECT的结果与存储过程中的另一个SELECT语句联合起来 目前的结构如下:SQL:如何根据传递的参数有条件地调整WHERE子句,并且仍然使用UNION,sql,stored-procedures,parameters,union,where-clause,Sql,Stored Procedures,Parameters,Union,Where Clause,我对SQL相当缺乏经验。我正在使用SQL Server 2012 基本上,我希望根据传递给存储过程的某些参数的值来调整SQL SELECT语句的WHERE子句 我还将把这个SELECT的结果与存储过程中的另一个SELECT语句联合起来 目前的结构如下: CREATE PROCEDURE dbo.procMyProcedure @Param1 smallint = null , @Param2 int = null , ... AS ... --I have three separa
CREATE PROCEDURE dbo.procMyProcedure
@Param1 smallint = null
, @Param2 int = null
, ...
AS ...
--I have three separate SELECT statements, each catering for a specific scenario
SELECT ...
FROM ...
WHERE
(ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND
(EE.EME_Number = ISNULL(@Param2, EE.EME_Number))
SELECT ...
FROM ...
WHERE
(EE.EME_Number = ISNULL(@Param2, EE.EME_Number))
SELECT ...
FROM ...
WHERE
(ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number))
除了WHERE子句外,这些语句是相同的。在我的场景中,第一条语句正好返回1个结果。第二个返回119个结果。第三个返回3个结果
我不想运行这三个语句。我想将它们合并到一个语句中,根据传递的(可选)参数的值,该语句返回与上述三个语句相同的结果
如果。。。否则,如果是结构,那么我就不能使用并集。以下结构不起作用:
IF ...
SELECT ...
ELSE IF ...
SELECT ...
ELSE IF ...
SELECT ...
UNION
SELECT ...
必须有一种方法将它们合并到一个SELECT语句中,这样我就可以将它用作UNION语句的一部分
我想谈以下几点:
SELECT ... --This select
UNION
SELECT ... --Other stuff
我真的很感谢你在这方面的帮助
问候,
Adam。如果emr\u编号和eme\u编号不可为空,只需使用OR而不是and运行第一个查询即可。我已经想出了解决我问题的办法。它涉及到一些布尔逻辑和一些空值的使用以及相当数量的方括号 这是我一直在寻找的WHERE条款:
WHERE
((ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND
(EE.EME_Number = ISNULL(@Param2, EE.EME_Number)))
OR
((ER.EMR_Number = ISNULL(@Param1, NULL)) AND
(EE.EME_Number = ISNULL(@Param2, EE.EME_Number)))
OR
((ER.EMR_Number = ISNULL(@Param1, ER.EMR_Number)) AND
(EE.EME_Number = ISNULL(@Param2, NULL)))
它给出了我期望的确切结果,我仍然可以在UNION语句中使用查询
当然,可能有一个更优雅的解决方案。如果是,请邮寄
-Adam。在我的场景中,运行第一个查询只返回1个结果。运行第二个查询将返回119个结果。运行第三个查询将返回3个结果。它们是3种不同的场景。