2016-08-02 7 views
6

मेरे पास एक ऐसा मामला है जहां मुझे 'value1' के लिए कोई मान नहीं है, तो मुझे कॉलम फ़ील्ड 1 = 'value1' के लिए रिकॉर्ड प्राप्त करना होगा, तो मुझे 'डिफ़ॉल्ट' के लिए रिकॉर्ड प्राप्त करना चाहिए।'WHERE' खंड एसक्यूएल में किसी भिन्न मान पर फ़ॉलबैक कैसे करें?

उपरोक्त परिदृश्य मैं दो प्रश्नों का इस्तेमाल किया है के लिए:

Select * from table_name where field1="value1"

ऊपर क्वेरी वापस किसी भी रिकॉर्ड मैं निम्न क्वेरी आग देना नहीं होता है:

Select * from table_name where field1="default"

अब मैं ऊपर एक प्रश्न में उपरोक्त करना चाहते हैं। क्या कोई मेरी मदद कर सकता है। मेरा मानना ​​है कि उत्तर CASE WHEN खंड का उपयोग करने में कहीं स्थित है।

इसके अलावा उपरोक्त प्रश्नों को ऑरैकल, पोस्टग्रेस के साथ-साथ mysql के लिए भी काम करना चाहिए।

+4

आप किस rdbms का उपयोग कर रहे हैं? –

+0

पोस्टग्रेस, mysql और oracle – user2713255

उत्तर

3

उपयोग के मामले और की तरह मौजूद है नीचे

Select * from table_name where field1= 
    case when exists(select 1 from table_name where field1='value1') 
    then 'value1' else 'default 'end 
0

MySQL के लिए:

SET @a = Select Count(*) from table_name where field1="value1" 
IF @a > 0 Then 
Select 
    * 
from 
    table_name 
where 
    field1="value1" 
ELSE 
Select 
    * 
from 
    table_name 
where 
    field1="default" 
END IF 
6

कोर ANSI SQL जवाब, सभी विभिन्न प्लेटफार्मों पर चलाने के लिए उम्मीद:

select * from table_name 
where field1 = 'value1' 
    or (field1 = 'default' 
     and NOT EXISTS (select 1 from table_name where field1 = 'value1')) 
0

ठीक है, मैं ऐसा करने की कोशिश की यह प्रतीत होता है।

SELECT * FROM table_name WHERE 
CASE 
    WHEN EXISTS(SELECT * FROM table_name WHERE field1='value1') THEN field1= 'value1' 
    ELSE field1='default' 
END 
+0

यह काम नहीं करेगा – TheGameiswar

+0

यह काम कर रहा है मैंने पोस्टग्रेज़ में कोशिश की। – user2713255

0

आप इस कोशिश कर सकते ...

select * table_name where field1="default" 
and not exists (select * from table_name where field1="value1") 
union all 
select * from table_name where field1="value1" 
0

आप count चेक के साथ case कथन का उपयोग कर सकते हैं।

select * 
    from table_name 
where coulmn_1 = (case 
     when (select count(1) from dc_date_card where coulmn_1 = value_1) > 0 then 
value_1 
else 
    Default 
    end) 
+0

केस अभिव्यक्ति, बयान नहीं। – jarlh

1

इष्टतम समाधान coalesce() का उपयोग कर:

Select * from table_name where field1 = coalesce (
    (select field1 from table_name where field1='value1' limit 1) 
    , 'default' 
); 

सूचना सबक्वेरी में limit 1: इस मामले में यह है कि सबसिलेक्ट एक से अधिक पंक्तियां वापस नहीं करता है सुनिश्चित करने के लिए अनिवार्य है। लेकिन case when exists (...) दृष्टिकोण का उपयोग करके भी इसे जोड़ने का एक अच्छा अभ्यास है। अन्यथा, डेटाबेस इंजन को सबक्वायरी से मेल खाने वाली सभी पंक्तियों को स्कैन करने के लिए मजबूर किया जा सकता है।

बेशक, अधिकांश आधुनिक डेटाबेस चुपचाप इसे अनुकूलित करने के लिए स्मार्ट enougth हैं। लेकिन कुछ पुराने लोग नहीं कर सके। और वैसे भी, यह ऐसे मामले हो सकते हैं जहां वे नहीं कर सकते।

उदाहरण के लिए, पोस्टग्रेएसक्यूएल में, अगर सबक्वायरी स्थिर कार्यों के रूप में गैर (या सही ढंग से घोषित नहीं किया गया) का उपयोग करता है, तो योजनाकार को लगातार परिणाम देने के लिए एक पूर्ण स्कैन करने के लिए मजबूर किया जाएगा यदि उस फ़ंक्शन में कोई भी | आदर्श प्रभाव है ।

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