संक्षिप्त उत्तर, नहीं।
थोड़ा लंबा जवाब लगभग है।
यह केवल दिखाई देता है कि प्रत्येक कथन से प्राप्त परिणाम समान है। अगर हम डेटा प्रकार का मूल्यांकन करने के DUMP फ़ंक्शन का उपयोग लौटे आप देखेंगे कि मैं क्या मतलब है:
SQL> select dump(case 1 when 2 then null else 0 end) as simple_case
2 , dump(case when 1 = 2 then null else 0 end) as searched_case
3 , dump(decode(1, 2, null, 0)) as decode
4 from dual;
SIMPLE_CASE SEARCHED_CASE DECODE
------------------ ------------------ -----------------
Typ=2 Len=1: 128 Typ=2 Len=1: 128 Typ=1 Len=1: 48
SQL Fiddle
आप देख सकते हैं कि डीकोड करने के डेटा प्रकार 1 है, जबकि दो मामले बयान "डेटा" का डेटा प्रकार 2. ओरेकल के Data Type Summary का उपयोग करके, DECODE एक VARCHAR2 (डेटा प्रकार 1) लौटा रहा है जबकि CASE कथन "वापसी" संख्याएं (डेटा प्रकार 2) हैं।
मुझे लगता है कि ऐसा इसलिए होता है, क्योंकि नाम बताते हैं कि DECODE फ़ंक्शन है और CASE नहीं है, जिसका अर्थ है कि उन्हें आंतरिक रूप से अलग-अलग कार्यान्वित किया गया है। इसे साबित करने का कोई वास्तविक तरीका नहीं है।
आपको लगता है कि यह वास्तव में कुछ भी प्रभावित नहीं करता है। यदि आपको इसकी संख्या ओरेकल होने की आवश्यकता है तो यह वर्ण को implicit conversion rules के तहत एक संख्या में रूपांतरित कर देगा, है ना? यह या तो सत्य नहीं है, यह won't work in a UNION डेटा प्रकार के समान होने के लिए है; आपके लिए चीजों को आसान बनाने के लिए ओरेकल कोई अंतर्निहित रूपांतरण नहीं करेगा।
ओरेकल अनुशंसा करता है कि स्पष्ट रूपांतरण निर्दिष्ट करते हैं, बजाय अस्पष्ट या स्वत: रूपांतरण पर भरोसा करते हैं, इन कारणों से::
SQL कथन को समझने के लिए आसान होता है दूसरे, यहां ओरेकल अंतर्निहित रूपांतरण के बारे में क्या कहते हैं है जब आप स्पष्ट डेटा प्रकार रूपांतरण कार्यों का उपयोग करते हैं।
लागू डेटा प्रकार रूपांतरण प्रदर्शन पर नकारात्मक प्रभाव डाल सकता है, विशेष रूप से यदि कॉलम मान का डेटा प्रकार किसी अन्य तरीके से स्थिर की तरह परिवर्तित हो जाता है।
लागू रूपांतरण उस संदर्भ पर निर्भर करता है जिसमें यह होता है और हर मामले में एक ही तरीके से काम नहीं कर सकता है। उदाहरण के लिए, किसी डेटाटाइम मान से VARCHAR2 मान में अंतर्निहित रूपांतरण NLS_DATE_FORMAT पैरामीटर के मान के आधार पर एक अप्रत्याशित वर्ष लौटा सकता है।
निहित रूपांतरण के लिए एल्गोरिदम सॉफ़्टवेयर रिलीज़ और ओरेकल उत्पादों में परिवर्तन के अधीन हैं। स्पष्ट रूपांतरणों का व्यवहार अधिक अनुमानित है।
एक सुंदर सूची नहीं है यही कारण है कि; लेकिन अंतिम बिंदु मुझे तारीखों पर अच्छी तरह से लाता है। हम पहले की क्वेरी लेने के लिए और यह एक के बजाय एक तिथि का उपयोग करता है में तब्दील हैं:
select case sysdate when trunc(sysdate) then null
else sysdate
end as simple_case
, case when sysdate = trunc(sysdate) then null
else sysdate
end as searched_case
, decode(sysdate, trunc(sysdate), null, sysdate) as decode
from dual;
एक बार फिर, इस प्रश्न पर DUMP का उपयोग कर मामले बयान डेटा प्रकार 12, एक दिन तक का प्रतिफल। DECODE ने sysdate
को VARCHAR2 में परिवर्तित कर दिया है।
SQL> select dump(case sysdate when trunc(sysdate) then null
2 else sysdate
3 end) as simple_case
4 , dump(case when sysdate = trunc(sysdate) then null
5 else sysdate
6 end) as searched_case
7 , dump(decode(sysdate, trunc(sysdate), null, sysdate)) as decode
8 from dual;
SIMPLE_CASE
----------------------------------
Typ=12 Len=7: 120,112,12,4,22,18,7
SEARCHED_CASE
----------------------------------
Typ=12 Len=7: 120,112,12,4,22,18,7
DECODE
----------------------------------
Typ=1 Len=19: 50,48,49,50,45,49,50,45,48,52,32,50,49,58,49,55,58,48,54
SQL Fiddle
नोट (एसक्यूएल फिडल में) DATE के सत्र NLS_DATE_FORMAT का उपयोग कर एक चरित्र में बदल दिया गया।
एक तिथि जो पूर्ण रूप से VARCHAR2 में परिवर्तित हो गई है, समस्याएं पैदा कर सकती है। यदि आप अपनी तिथि को किसी चरित्र में बदलने के लिए TO_CHAR का उपयोग करना चाहते हैं, तो आपकी क्वेरी उस ब्रेक को तोड़ देगी जहां आप इसकी अपेक्षा नहीं कर रहे हैं।
SQL> select to_char(decode(sysdate
2 , trunc(sysdate), null
3 , sysdate)
4 , 'yyyy-mm-dd') as to_char
5 from dual;
select to_char(decode(sysdate
*
ERROR at line 1:
ORA-01722: invalid number
SQL Fiddle
समान रूप से, तिथि अंकगणित नहीं रह गया काम करता है:
SQL>
SQL>
SQL> select decode(sysdate, trunc(sysdate), null, sysdate) + 1 as decode
2 from dual;
select decode(sysdate, trunc(sysdate), null, sysdate) + 1 as decode
*
ERROR at line 1:
ORA-01722: invalid number
SQL Fiddle
दिलचस्प बात यह है केवल डिकोड एक VARCHAR2 को अभिव्यक्ति धर्मान्तरित यदि संभव हो तो परिणामों में से एक शून्य है। यदि डिफ़ॉल्ट मान शून्य है तो ऐसा नहीं होता है। उदाहरण के लिए:
SQL> select decode(sysdate, sysdate, sysdate, null) as decode
2 from dual;
DECODE
-------------------
2012-12-04 21:18:32
SQL> select dump(decode(sysdate, sysdate, sysdate, null)) as decode
2 from dual;
DECODE
------------------------------------------
Typ=13 Len=8: 220,7,12,4,21,18,32,0
SQL Fiddle
ध्यान दें कि डीकोड करने 13. यह दस्तावेज नहीं है, लेकिन है की एक डेटा प्रकार वापस आ गया है, मुझे लगता है, आदि काम करता है तारीख गणित के रूप में की तारीख का एक प्रकार है।
संक्षेप में, यदि आप संभवतः DECODE से बचें; आपको जरूरी डेटा प्रकारों की आवश्यकता नहीं हो सकती है जो आप उम्मीद कर रहे हैं। quote Tom Kyte:
डीकोड कुछ हद तक अस्पष्ट है - केस बहुत स्पष्ट है। चीजें जो डीकोड में करना आसान है केस में करना आसान है, हार्ड या डीकोड के साथ असंभव के पास असंभव चीजें केस में करना आसान है। केस, तर्क बुद्धिमान, हाथ नीचे जीतता है।
बस पूरा होने के लिए वहाँ डीकोड करने और मामले के बीच दो कार्यात्मक मतभेद हैं।
- DECODE पीएल/एसक्यूएल के भीतर उपयोग नहीं किया जा सकता है।
मामला nulls सीधे
SQL> select case null when null then null else 1 end as case1
2 , case when null is null then null else 1 end as case2
3 , decode(null, null, null, 1) as decode
4 from dual
5 ;
CASE1 CASE2 DECODE
---------- ---------- ------
1
SQL Fiddle
आप सही हैं यह बहुत आसान है :-)। – Ben
SO पर उत्तर के संबंध में अक्सर कम होता है। – user2672165