2011-06-01 6 views
7

मेरे पास ऑरैकल क्वेरी है और इसका हिस्सा DECODE का उपयोग करके कुछ मान की गणना कर रहा है। उदाहरण के लिए:ऑरैकल: डीकोड और सबक्वायरी परिणाम का चयन करें

SELECT ..., 
     (SELECT DECODE((SELECT 23 FROM DUAL), 
         0, null, 
        (SELECT 23 FROM DUAL)) 
     FROM DUAL) 
    FROM ... 

यहाँ मूल्य "23" रनटाइम पर गणना की जाती है, और यह काफी जटिल मिलती है -, कई तालिकाओं का उपयोग करता PARTITION BY आदि तो मैं एक ही सबक्वेरी को क्रियान्वित करता है, तो मान "नहीं है 0 से बचना चाहते हैं "। क्या इस तरह कुछ लिखने का कोई तरीका है

SELECT ..., 
     (SELECT DECODE ((SELECT 23 FROM DUAL) as test, 
         0, null, 
         test) 
     FROM DUAL) 
    FROM ... 

उत्तर

9

क्या यह आपके लिए काम करेगा? मैंने अभी "23" को एक वर्णनात्मक उपनाम के साथ एक इनलाइन तालिका में स्थानांतरित कर दिया है।

select ..., 
    (
    select 
    decode ( 
      computed_value.val, 
      0, null, 
      computed_value.val 
      ) 
    from 
    (select 23 as val from dual) computed_value 
) 
from 
    ... 

एक मामला बयान भी रूप में, स्पष्टता जोड़ सकते हैं:

select 
    ... 
,case when computed_value.val = 0 
     then null 
     else computed_value.val 
     end as my_field 
from 
    (select 23 as val from dual) computed_value 
    ... 
+0

आपके सरल और उपयोगी इनपुट के लिए धन्यवाद। – hanumant

0

आप खंड से में सबक्वेरी का उपयोग करें और नीचे की तरह कुछ कर सकते हैं:

select conf_key, decode(test, 0, null, test) from (
select conf_key, (select conf_value from config_values where conf_key = 'DOMAINID') as TEST from config_values) 
1

या:

WITH q AS (
SELECT 23 test, 16 test2 FROM dual 
) 
SELECT ... 
    , DECODE(q.test, 0, NULL, q.test) value 
    , CASE WHEN q.test2 = 0 THEN NULL 
      WHEN q.test2 = 16 THEN 1 
      ELSE q.test2 
     END another_value 
    FROM q, ... 

आपको "q" thro क्वेरी का उपयोग करने देता है अपने मुख्य चयन के बारे में, जहां कभी एक सबक्वायरी की अनुमति है। खंड के साथ, या सामान्य तालिका अभिव्यक्ति, या सबक्वायरी फैक्टरिंग कहा जाता है। Oracle-Base.com पर इसके बारे में और पढ़ें।

SELECT ..., 
     (SELECT NULLIF((SELECT 23 FROM DUAL), 0) 
     FROM DUAL) 
    FROM ... 

NULLIF फ़ंक्शन NULL अगर दो तर्क बराबर हैं, अन्यथा यह पहला तर्क देता है:

+0

हाय @ डीक्यूकी, आपके इनपुट के लिए धन्यवाद। मैं 'as as' का उपयोग नहीं कर सकता क्योंकि subquery बाहरी क्वेरी से कुछ मानों का उपयोग कर रहा है। – hanumant

1

इस विशेष परिदृश्य के लिए, आप NULLIF समारोह इस्तेमाल कर सकते हैं।

0

बेहतर आप केस स्टेटमेंट का उपयोग करेंगे। चूंकि केस स्टेटमेंट आईएफ स्टेटमेंट की श्रृंखला की तरह है, केवल मुख्य शब्द WHEN का उपयोग कर रहा है। एक केस स्टेटमेंट का मूल्यांकन ऊपर से नीचे तक किया जाता है। यदि कोई शर्त सत्य है, तो संबंधित THEN खंड निष्पादित किया जाता है और निष्पादन अंत कारण (शॉर्ट सर्किट मूल्यांकन) खंड पर कूदता है।

संबंधित मुद्दे