'सेलेक्ट' स्टेटमेंट में 'इफ' - कॉलम वैल्यू के आधार पर आउटपुट वैल्यू चुनें


685
SELECT id, amount FROM report

अगर और अगर मुझे amountहोना चाहिए । मैं इसे उपरोक्त क्वेरी में कैसे जोड़ूं?amountreport.type='P'-amountreport.type='N'

जवाबों:


1025
SELECT id, 
       IF(type = 'P', amount, amount * -1) as amount
FROM report

Http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html देखें ।

इसके अतिरिक्त, आप स्थिति के शून्य होने पर संभाल सकते हैं। शून्य राशि के मामले में:

SELECT id, 
       IF(type = 'P', IFNULL(amount,0), IFNULL(amount,0) * -1) as amount
FROM report

भाग का IFNULL(amount,0)मतलब है जब राशि शून्य वापसी राशि नहीं है तो वापसी 0


5
मुझे आश्चर्य है कि अगर यहां COALESCE के बजाय इस IFNULL का उपयोग करने का कोई फायदा है?
क्रिस

4
Mysql स्रोत से, मुझे कॉलेसे की 2 परिभाषाएँ, 2 में से एक तर्क के साथ, और अन्य तर्कों की एक सूची के साथ, लेकिन ifnull 2 ​​मापदंडों के साथ coalesce को आमंत्रित करता हैsql/item_cmpfunc.h 722: Item_func_ifnull(Item *a, Item *b) :Item_func_coalesce(a,b) {}
Felipe Buccioni

2
यदि 'एन' और 'पी' की तुलना में अलग-अलग रिपोर्ट प्रकार हैं, तो उत्तर सही नहीं है, बेहतर "केस स्टेटमेंट" समाधान में BadHorsie की टिप्पणी देखें।
Trygve

3
@Trygve प्रश्न 2 स्थितियों के लिए है, और एक IFकथन की तलाश में है, क्या गलत है?
फेलिप बुकेनी

2
@ फ़ेलिप, उत्तर आवश्यक रूप से 100% सही नहीं है, एन और पी के अलावा अन्य रिपोर्ट प्रकार हो सकते हैं। आपके मामले में, यह त्रुटि का चयन कर सकता है, यदि रिपोर्ट का प्रकार (उदाहरण के रूप में) 'ई' है। प्रश्न यह उल्लेख करने में विफल रहता है कि क्या अन्य रिपोर्ट प्रकार हैं, हालांकि मैं अपने डाउनवोट को हटा देता हूं। मैं सिर्फ इन मामलों में रक्षात्मक रूप से कार्यक्रम करना पसंद करता हूं, इसलिए अन्य पाठकों के लिए एक सिर है।
Trygve

255

एक caseकथन का उपयोग करें :

select id,
    case report.type
        when 'P' then amount
        when 'N' then -amount
    end as amount
from
    `report`

5
@ इवान: सच। मैं उन्हें स्पष्टता के लिए उपयोग करता हूं। ऐसा नहीं है कि यह वैसे भी कुछ भी प्रभावित करता है।
मेलामोकब

3
मैं किसी विशेष डेटाबेस के लिए कस्टम सिंटैक्स पर ANSI मानक सिंटैक्स पसंद करता हूं।
गॉर्डन लिनोफ़

2
यह सबसे अच्छा समाधान है क्योंकि स्वीकृत उत्तर समाधान आवश्यक नहीं है यदि रिपोर्ट के लिए अन्य मान हैं। यह कह रहा है if report.type = 'P' use amount, otherwise use -amount for anything else। यदि यह 'P' नहीं है तो यह प्रकार पर विचार नहीं करेगा।
BadHorsie

97
SELECT CompanyName, 
    CASE WHEN Country IN ('USA', 'Canada') THEN 'North America'
         WHEN Country = 'Brazil' THEN 'South America'
         ELSE 'Europe' END AS Continent
FROM Suppliers
ORDER BY CompanyName;


15

सबसे सरल तरीका एक IF () का उपयोग करना है । हाँ मैसकल आपको सशर्त तर्क करने की अनुमति देता है। IF फंक्शन में 3 Params CONDITION, TRUE OUTCOME, FALSE OUTCOME लगते हैं।

तो तर्क है

if report.type = 'p' 
    amount = amount 
else 
    amount = -1*amount 

एसक्यूएल

SELECT 
    id, IF(report.type = 'P', abs(amount), -1*abs(amount)) as amount
FROM  report

आप एब्स को छोड़ सकते हैं () अगर सभी नहीं हैं तो केवल वी


12
SELECT id, amount
FROM report
WHERE type='P'

UNION

SELECT id, (amount * -1) AS amount
FROM report
WHERE type = 'N'

ORDER BY id;

जैसा कि परिणाम सेट पारस्परिक रूप से अनन्य हैं, मैं यहां UNION ALL को प्राथमिकता देता हूं।
अर्थ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.