2015-10-16 65 views
0

我正在尋找where子句中使用變量的case語句的一個很好的示例。變量返回的數字決定了where子句的結果。我的查詢是這樣的:在where子句中使用CASE - 使用參數

IF   @RequestType = 99 
    SELECT @Received = count(*) 
    FROM Request r 
    WHERE request_received_date between @beginDate and @endDate 
    AND  request_type_id <> 5 
    ELSE IF @RequestType = 100 
BEGIN 
    SELECT @Received = count(*) 
    FROM Request r 
    WHERE request_received_date between @beginDate and @endDate 
END 
    ELSE 
BEGIN 
    SELECT @Received = count(*) 
    FROM Request r 
    WHERE request_received_date between @beginDate and @endDate 
    AND  request_type_id = 
      (CASE WHEN @RequestType = 1 THEN (1) 
      WHEN @RequestType = 2 THEN (2) 
      WHEN @RequestType = 3 THEN (3) 
      WHEN @RequestType = 4 THEN (4) 
      WHEN @RequestType = 5 THEN (5) 
      END) 
END 

因此,大家可以看到,有7個選項 - 客戶願意與他們在報告中看到的數據量靈活。這看起來很麻煩,但我想不出有任何其他的方式來做到這一點。

+1

請編輯您的問題以包括SQL的版本作爲其中一個標記。 – Dijkgraaf

+6

該病例陳述的要點是什麼?爲什麼不只是:'request_type_id = @ RequestType' –

回答

0

你很可能簡化查詢到...

SELECT 
     count(*) as Received 
    FROM 
     (select 3 as RqType, 
       '2015-10-01' as beginDate, 
       '2015-10-20' as endDate) as PV, 
     Request r 
    WHERE 
      request_received_date between PV.beginDate and PV.endDate 
     AND case when PV.RqType = 100 then 1=1 
       when PV.RqType = 99 then r.request_type_id <> 5 
       when PV.RqType <= 6 then PV.RqType = r.request_type_id 
      end 

最後一種情況/當組件請求類型匹配越來越6下的值,以匹配該請求的類型。如果你有否定的話,那就調整一下。

我修改了查詢以使預查詢「PV」指示您正在查找的參數值,因此只需根據需要將它們更改爲任何請求類型和日期範圍即可。這對於SQL-Server應該是很好的,也可能是其他的SQL引擎。通過只查詢沒有「FROM」的硬值,它本質上創建了一個單一記錄的結果集,然後可以將這些值用於查詢的其餘部分。任何一個記錄都不會成爲任何笛卡爾連接的問題。

+0

我正在拍這個時刻的額頭。謝謝你的推動;) – Ringl

+0

@Ringl,很高興你還沒有把前額弄平:)...另外,如果有效,請確保標記爲已解決,以便其他人也知道...還可以退房HELP - > TOUR爲現場禮節。歡迎來到論壇。 – DRapp

+0

這是mysql語法嗎? sql server版本的外觀如何? – Ringl

0

在WHERE子句中,通常不需要CASE WHEN,因爲您有AND和OR。您的查詢轉換爲:

select @Received = count(*) 
from request 
where request_received_date between @beginDate and @endDate 
and 
(
    @RequestType = 100 
    or 
    (@RequestType = 99 and request_type_id <> 5) 
    or 
    (@RequestType = request_type_id and request_type_id in (1,2,3,4,5)) 
);