2011-03-09 16 views
7

मेरे पास एक मालिक_आईडी फ़ील्ड के साथ एक वाहन तालिका है। यह स्वामी_आईडी किसी ग्राहक तालिका में आईडी फ़ील्ड या किसी व्यापार तालिका में आईडी फ़ील्ड के अनुरूप होगा। मैं उस तालिका के आधार पर अलग-अलग मूल्यों को वापस देख रहा हूं जो आईडी से संबंधित है।केस स्टेटमेंट के माध्यम से एकाधिक मानों का चयन करें?

SELECT v.Make, v.Model 
FROM Vehicle v 
LEFT JOIN Customer c ON c.ID = v.Owner_ID 
LEFT JOIN Business b ON b.ID = v.Owner_ID 

तो कहते हैं कि मैं ग्राहक उपनाम अगर owner_id = Customer.ID वापस करना चाहते हैं, और यदि owner_id = business_id व्यापार नाम:

मैं इस बयान की है। मैं जानता हूँ कि मैं इस तरह के रूप CASE कथन का उपयोग कर सकते हैं:

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN c.Surname 
     WHEN b.ID IS NOT NULL THEN b.Name 

लेकिन वहाँ एक तरह से एक मामले बयान से एक से अधिक मान प्राप्त करने के लिए है? की तरह कुछ: (। मैं जानता हूँ कि यह पूरी तरह से जिस तरह से गलत है)

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN 
      SELECT c.Surname, c.Date_Of_Birth 
     WHEN b.ID IS NOT NULL THEN 
      SELECT b.Name, b.Founded 

या मैं होगा करने के लिए:

SELECT v.Make, v.Model, 
    CASE WHEN c.ID IS NOT NULL THEN c.Surname 
     WHEN b.ID IS NOT NULL THEN b.Name 
    END AS "Name", 
    CASE WHEN c.ID IS NOT NULL THEN c.Date_Of_Birth 
     WHEN b.ID IS NOT NULL THEN b.Founded 
    END AS "DOB/Founded" 

उत्तर

2

कोशिश कर सकते हैं कोई वहाँ एकाधिक स्तंभों को पार करने वाली एक case अभिव्यक्ति की एक शाखा पाने के लिए कोई रास्ता नहीं है।

अपने उदाहरण मामले में आप

SELECT v.Make, 
     v.Model, 
     MAX(COALESCE(c.Surname, b.name)) as name 
FROM Vehicle v 
     LEFT JOIN Customer c 
     ON c.ID = v.Owner_ID 
     LEFT JOIN Business b 
     ON b.ID = v.Owner_ID 
GROUP BY v.Owner_ID 
+0

हाँ मैं कर सकता, लेकिन मैं कुछ अन्य बिट और टुकड़ों है कि यह एक नहीं जाने बनाता है बाहर छोड़ दिया कर सकता है, मैं नेस्टेड 'COALESCE' बयान के साथ यह कर सकता है, लेकिन मुझे लगता है कि मैं पठनीयता उद्देश्यों के लिए 'केस 'के साथ रहूंगा। – anothershrubery

2

मैं यह स्पष्ट क्या कॉलम क्वेरी लौटना चाहिए होने की जरूरत है लगता है और यह क्वेरी के आधार पर नहीं बदला जा सकता है। तो शर्तों को प्रति स्तंभ तोड़ना होगा।

IF के बारे में क्या? इस मामले में पढ़ने के लिए आसान हो सकता है।

SELECT v.Make, v.Model, 
    IF(c.ID IS NOT NULL, c.Surname,  IF(b.ID IS NOT NULL, b.Name, NULL)) as `Name` 
    IF(c.ID IS NOT NULL, c.Date_Of_Birth, IF(b.ID IS NOT NULL, b.Founded, NULL)) as `DOB_Founded` 
0

सुनिश्चित नहीं है, लेकिन आप इस एक

SELECT v.Make, v.Model 
FROM Vehicle v 
LEFT JOIN Customer c ON c.ID = v.Owner_ID 
LEFT JOIN Business b ON b.ID = v.Owner_ID 
WHERE c.Surname IS NOT NULL 
OR b.name IS NOT NULL 
संबंधित मुद्दे