代码之家  ›  专栏  ›  技术社区  ›  user1058946

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

  •  0
  • user1058946  · 技术社区  · 13 年前

    我对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
    

    我真的很感谢你的帮助。

    当做

    亚当。

    2 回复  |  直到 13 年前
        1
  •  1
  •   user1058946    13 年前

    好的。我已经想出了解决问题的办法。它涉及一些布尔逻辑以及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语句中使用该查询。

    当然,可能还有一个更优雅的解决方案。如果是,请张贴。

    -亚当。

        2
  •  0
  •   podiluska    13 年前

    如果emr_number和eme_number不可为null,只需使用OR而不是and运行第一个查询