परिणाम . से पंक्ति को हटाने के लिए यदि कोई स्रोत एक ही id
. के लिए पंक्तियां इसमें मान IS NULL है
, पोस्टग्रेज . में एक समाधान एग्रीगेट फ़ंक्शन का उपयोग करना होगा हर ()
या (ऐतिहासिक कारणों का पर्यायवाची) बूल_और ()
होने
. में खंड:
SELECT id
, max(case when colID = 1 then value else '' end) AS fn
, max(case when colID = 2 then value else '' end) AS ln
, max(case when colID = 3 then value else '' end) AS jt
FROM tbl
GROUP BY id
HAVING every(value IS NOT NULL);
व्याख्या करें
WHERE
. के साथ आपका प्रयास क्लॉज सिर्फ एक को खत्म कर देगा id =3
. के लिए स्रोत पंक्ति आपके उदाहरण में (colID =1
. वाला वाला ), एक ही id
. के लिए दो और छोड़कर . तो हमें अभी भी id =3
. के लिए एक पंक्ति मिलती है परिणाम में एकत्रीकरण के बाद।
लेकिन चूंकि हमारे पास colID =1
. के साथ कोई पंक्ति नहीं है , हमें एक खाली स्ट्रिंग मिलती है (नोट:NULL
. नहीं value!) fn
. के लिए id =3
. के परिणाम में ।
Postgres में एक तेज़ समाधान crosstab()
. का उपयोग करना होगा . विवरण:
अन्य RDBMS
जबकि हर
एसक्यूएल:2008 मानक में परिभाषित किया गया है, कई आरडीबीएमएस इसका समर्थन नहीं करते हैं, संभवतः क्योंकि उनमें से कुछ में बूलियन प्रकार के छायादार कार्यान्वयन हैं। ("MySQL" या "Oracle" जैसे किसी भी नाम को नहीं छोड़ना ...) आप शायद हर जगह (पोस्टग्रेज सहित) इसके साथ स्थानापन्न कर सकते हैं:
SELECT id
, max(case when colID = 1 then value else '' end) AS fn
, max(case when colID = 2 then value else '' end) AS ln
, max(case when colID = 3 then value else '' end) AS jt
FROM tbl
GROUP BY id
HAVING count(*) = count(value);
क्योंकि गिनती ()
NULL मानों की गणना नहीं करता है। MySQL में बिट_और ()
.इस संबंधित प्रश्न के तहत और अधिक: