SQL:如何根据传递的参数有条件地调整WHERE子句,并且仍然使用UNION



我对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 运行第一个查询

最新更新