[英]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.