簡體   English   中英

SQL:如何根據傳遞的參數有條件地調整WHERE子句,並且仍然可以與UNION一起使用

[英]SQL: How To Conditionally Adjust the WHERE Clause Depending on Passed Parameters and still work with 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不可為空,則只需使用OR(而不是AND)運行第一個查詢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM