0

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

我真的很感激这方面的任何帮助。

问候,

亚当。

4

2 回答 2

1

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

当然,可能有更优雅的解决方案。如果有,请发帖。

-亚当。

于 2012-09-07T05:56:19.233 回答
0

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

于 2012-09-06T05:18:33.803 回答