2016-03-01 21 views
2

我也這是會自動運行一個月多次發表聲明如下:使用的條件與CASE上的Oracle SQL

select  
     case 

     when to_char(sysdate, 'MM') <> '03' or (to_char(sysdate, 'MM')= '03' 
     and count(a.cust_id) >'1000000') then '0' 
     when to_char(sysdate, 'MM')= '03' and count(a.cust_id) <'1000000' then '1' 
     end 

from table a 
where a.template_id = '99' 
and a.start_date >= sysdate-1 

由於計語句運行很長時間,我想補充一個條件 ,只允許它在當前月份是3月份時運行。當它不是三月它應該只顯示'0'

任何想法如何做到這一點?可以在這裏使用ELSE嗎?

謝謝, Assaf。

+0

聽起來。 –

回答

3

甲骨文uses short-circuit evaluation

Oracle數據庫使用短路計算。對於簡單的CASE表達式,數據庫僅在將其與expr比較之前評估每個comparison_expr值,而不是在將它們與expr進行比較之前評估所有的compare_expr值。因此,如果之前的比較表達式等於expr,Oracle從不評估compare_expr。對於搜索的CASE表達式,數據庫評估每個條件以確定它是否爲真,並且如果先前條件爲真,則從不評估條件。

所以,如果你有那麼三個條件如果第一個將匹配計數不會做:

case 
    when to_char(sysdate, 'MM') <> '03' then 0 
    when count(a.cust_id) > 1000000) then 0 
    else 1 
end 

但是它仍然會打所有從表中匹配濾波器值,該行的,所以你不會因爲這樣做而獲得任何表現。

你可以移動的次數和訪問表爲子查詢,使整個事情的條件之一:

select  
    case 
    when extract(month from sysdate) <> 3 then 0 
    when (
     select count(a.cust_id) 
     from tablea a 
     where a.template_id = 99 
     and a.start_date >= sysdate-1) > 1000000 then 0 
    else 1 
    end 
from dual; 

我也改變了一些字符串字面量數字,以避免額外的隱式轉換 - 這是可能的你的ID實際上是字符串。你可能想要調查爲什麼計數本身很慢;或許start_date未被編入索引,或者它正在選擇一個不同的索引。看看自己的執行計劃是否可以調整。

+0

非常感謝,完美的作品!你是,對,start_date沒有索引。 – Shlomix

0

入住此腳本:

 select  
      case 

      when to_char(sysdate, 'MM') <> '03' or (to_char(sysdate, 'MM')= '03' 
      and count(a.cust_id) >'1000000') then '0' 
      when to_char(sysdate, 'MM')= '03' and count(a.cust_id) <'1000000' then '1' 
      else 'Your Text' 
      end 
     from table a 
     where a.template_id = '99' 
     and a.start_date >= sysdate-1 
0

像你想的`if`語句和兩條查詢可以使用嵌套的情況下,如下圖所示

SELECT 
    CASE 
    WHEN TO_CHAR(sysdate, 'MM') <> '03' 
    THEN '0' 
    WHEN TO_CHAR(sysdate, 'MM')= '03' THEN 
    CASE 
    WHEN COUNT(a.cust_id) <'1000000' 
    THEN '1' 
    WHEN COUNT(a.cust_id)   >'1000000' 
    THEN '0' 
    END 
    END 
FROM table a 
WHERE a.template_id = '99' 
AND a.start_date >= sysdate-1