我对SQL相当缺乏经验。我使用的是SQL Server 2012。
基本上,我希望SQL SELECT语句的WHERE子句根据传递给存储过程的某些参数的值进行调整。
我还将把这个SELECT的结果与存储过程中的另一个SELECT语句联合起来。
到目前为止的结构如下:
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个结果。
我不想运行所有三个语句。我想将它们合并为一个语句,根据传递的(可选)参数的值,该语句将返回与上面三个语句相同的结果。
我可以通过将SELECT封装在嵌套的IF中来实现这一点。。。ELSE IF结构,但我不能使用UNION。以下结构不起作用:
IF ...
SELECT ...
ELSE IF ...
SELECT ...
ELSE IF ...
SELECT ...
UNION
SELECT ...
必须有一种方法将它们合并到一个SELECT语句中,这样我就可以将其作为UNION语句的一部分使用。
我想到达以下位置:
SELECT ... --This select
UNION
SELECT ... --Other stuff
我真的很感谢你的帮助。
问候,
亚当。
好。我已经想出了解决问题的办法。它涉及一些布尔逻辑以及NULL和相当数量的括号的使用。
这是我要找的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语句中使用该查询。
当然,可能还有一个更优雅的解决方案。如果是,请张贴。
-亚当。
如果emr_number和eme_number不可为null,只需使用OR而不是and 运行第一个查询