2011-01-13 14 views
7

मैं इस तरह एक प्रश्न है है यहाँ तक कि जब जाओ एक प्रश्न हमेशा ठीक एक पंक्ति वापस जाने के लिए,:ओरेकल: कोई डेटा पाया जा सकता है

select data_name 
    into v_name 
    from data_table 
    where data_table.type = v_t_id 

आम तौर पर, इस प्रश्न के ठीक एक पंक्ति लौटना चाहिए। जब v_t_id पर कोई मिलान नहीं होता है, तो प्रोग्राम "कोई डेटा नहीं मिला" अपवाद के साथ विफल रहता है।

मैं जानता हूँ कि मैं PL/SQL में इस संभाल सकता है, लेकिन वहाँ केवल एक प्रश्न में यह करने के लिए कोई तरीका है मैं सोच रहा था। एक परीक्षण के रूप में, मैं कोशिश की है:

select case 
      when subq.data_name is null then 
      'UNKNOWN' 
      else 
      subq.data_name 
     end 
from (select data_name 
     from data_table 
     where data_table.type = '53' /*53 does not exist, will result in 0 rows. Need fix this...*/ 
     ) subq; 

... लेकिन यह स्पष्ट रूप से काम नहीं करेगा (क्योंकि subq खाली किया जा रहा subq.data_name is null के रूप में ही नहीं है)। क्या यह भी संभव है या मुझे अपने पीएल/एसक्यूएल समाधान में जांच करनी चाहिए?

(Oracle 10g)

+1

यदि क्वेरी कोई पंक्ति नहीं लौटाती है तो डेटा_नाम के लिए आप क्या मूल्य चाहते हैं/चाहते हैं? कोई डेटा नहीं मिला स्थिति से निपटने की चुनौती है। –

+0

@ थॉमस: स्ट्रिंग "अनकनाउन" इस परिदृश्य में ठीक काम करेगी। – FrustratedWithFormsDesigner

उत्तर

18

इस सरल और क्लीनर बनाने के तरीके है, लेकिन यह मूल रूप से तकनीक बाहर मंत्र:

SELECT data_name 
FROM data_table 
WHERE data_table.type = v_t_id 

UNION ALL 

SELECT NULL AS data_name 
FROM dual 
WHERE NOT EXISTS (
    SELECT data_name 
    FROM data_table 
    WHERE data_table.type = v_t_id 
) 

जब संघ के पहले भाग में खाली है दूसरा एक पंक्ति में शामिल होंगे, जब पहली हिस्सा खाली नहीं है, दूसरे में कोई पंक्ति नहीं होगी।

तो क्वेरी है ज्यादा समय के लिए ले जाता है, का उपयोग इस एक:

SELECT * FROM ( 
    SELECT data_name 
    FROM data_table 
    WHERE data_table.type = v_t_id 

    UNION ALL 

    SELECT NULL AS data_name 
    FROM dual 
) WHERE data_name is not null or ROWNUM = 1 
+0

मुझे यह पसंद है, 'EXISTS' पूरी चीज़ का अर्थ बहुत स्पष्ट नहीं बनाता है। – FrustratedWithFormsDesigner

0

आप हमेशा शून्य या एक पंक्ति तो आप एक समूह समारोह यानी उपयोग कर सकते हैं की आशा करते हैं:

select dump(max(dummy)) from dual 
where dummy = 'Not Found' 

तुम हमेशा कम से कम एक पंक्ति और में शून्य का एक मूल्य मिल जाएगा वह मामला जहां रिकॉर्ड नहीं मिला है।

9

मैं अपवाद को संभालना पसंद करूंगा। बहरहाल, यह आपके द्वारा निर्दिष्ट के रूप में काम करेगा:

select min(data_name) data_name 
into v_name 
from data_table 
where data_table.type = v_t_id 

ध्यान दें कि यह भी "काम करता है" यदि क्वेरी रिटर्न अधिक से 1 पंक्ति - जो कि TOO_MANY_ROWS को बढ़ाया नहीं गया।

+0

'मिनट' के साथ चालाक चाल! – FrustratedWithFormsDesigner

1
select coalesce(data_table.data_name, d.data_name) data_name 
    into v_name 
    from 
    (SELECT 'UNKNOWN ' as data_name FROM DUAL) d 
    LEFT JOIN data_table 
    ON data_table.type = v_t_id 
      or a.data_table.data_name is null 
1

यहाँ का उपयोग कर मेरी सरल उपाय है वाम बाहरी शामिल हों है :

CREATE TABLE data_table(data_name VARCHAR2(20), data_type NUMBER(2)); 

INSERT INTO data_table(data_name, data_type) VALUES('fifty-one', 51); 

SELECT coalesce(data_name, 'unknown') 
    FROM dual 
    LEFT OUTER JOIN (SELECT data_name FROM data_table WHERE data_type = 53) o 
    ON 1 = 1; 

SELECT coalesce(data_name, 'unknown') 
    FROM dual 
    LEFT OUTER JOIN (SELECT data_name FROM data_table WHERE data_type = 51) o 
    ON 1 = 1; 
संबंधित मुद्दे