मेरे पास निम्न कथन है जो महीने में कई बार स्वचालित रूप से चलने वाला है:

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

चूंकि गिनती विवरण लंबे समय तक चलता है, इसलिए मैं एक शर्त जोड़ना चाहता हूं जो इसे चालू माह मार्च होने पर ही चलाने की अनुमति देगा। जब यह मार्च नहीं है तो इसे केवल '0' प्रदर्शित करना चाहिए

कोई विचार यह कैसे करें? क्या यहां ELSE का उपयोग किया जा सकता है?

धन्यवाद, असफ।

2
Shlomix 1 मार्च 2016, 15:01

3 जवाब

सबसे बढ़िया उत्तर

Oracle शॉर्ट-सर्किट मूल्यांकन का उपयोग करता है:

Oracle डेटाबेस शॉर्ट-सर्किट मूल्यांकन का उपयोग करता है। एक साधारण CASE व्यंजक के लिए, डेटाबेस प्रत्येक तुलना_एक्सपीआर मान का मूल्यांकन केवल एक्सप्र से तुलना करने से पहले करता है, बजाय इसके कि सभी तुलना_एक्सपीआर मानों का मूल्यांकन एक्सपीआर के साथ करने से पहले किया जाए। नतीजतन, ओरेकल कभी भी तुलना_एक्सपीआर का मूल्यांकन नहीं करता है यदि पिछली तुलना_एक्सपीआर एक्सप्र के बराबर है। खोजे गए 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;

मैंने अतिरिक्त निहित रूपांतरणों से बचने के लिए कुछ स्ट्रिंग अक्षर को संख्याओं में भी बदल दिया है - यह संभव है कि आपकी आईडी वास्तव में तार हों। हो सकता है कि आप जांच करना चाहें कि क्यों गिनती स्वयं धीमी है; शायद start_date अनुक्रमित नहीं है, या यह कोई भिन्न अनुक्रमणिका चुन रहा है। इसके लिए निष्पादन योजना को स्वयं देखें कि क्या इसे ट्यून किया जा सकता है।

3
Alex Poole 1 मार्च 2016, 15:49

इस स्क्रिप्ट की जाँच करें:

      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
Ahmad Aghazadeh 1 मार्च 2016, 15:24

आप नेस्टेड केस का उपयोग कर सकते हैं जैसा कि नीचे दिखाया गया है

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
0
Sandeep 1 मार्च 2016, 15:31