2010-03-15 15 views
11

मुझे आश्चर्य है कि SQLite में लंबे से विस्तृत प्रारूप से डेटा को परिवर्तित करने के लिए एक कैननिकल तरीका है (क्या यह ऑपरेशन आम तौर पर संबंधपरक डेटाबेस के डोमेन में होता है?)। मैंने MySQL के लिए this example का पालन करने का प्रयास किया लेकिन मुझे लगता है कि SQLite के पास समान नहीं है ... धन्यवाद!SQLite लंबे प्रारूपों के लिए लंबे समय तक?

उत्तर

12

IF एक गैर-मानक MySQL एक्सटेंशन है। हमेशा CASE का उपयोग करना बेहतर है जो मानक एसक्यूएल है और SQLite और MySQL (और MSSQL, Oracle, Postgres, Access, Sybase ... और चालू) सहित सभी अनुपालन डेटाबेस में काम करता है।

यहाँ कैसे CASE के साथ एक ही क्वेरी करने के लिए की एक उदाहरण है:

SELECT  Country, 
      MAX(CASE WHEN Key = 'President' THEN Value ELSE NULL END) President, 
      MAX(CASE WHEN Key = 'Currency' THEN Value ELSE NULL END) Currency 
FROM  Long 
GROUP BY Country 
ORDER BY Country; 

यहाँ एक और तरीका मिलती है का उपयोग करते हुए एक ही क्वेरी प्रतिनिधित्व करने के लिए है। मुझे लगता है कि यह शायद अधिक कुशल है, लेकिन यह मानता है कि प्रत्येक समूह के भीतर प्रत्येक कुंजी मान के लिए केवल एक रिकॉर्ड है (CASE संस्करण भी करता है, लेकिन यदि यह सत्य नहीं है, तो कम से कम अनुमानित परिणाम) अतिरिक्त पंक्तियों का नतीजा नहीं होगा।

SELECT 
    D.Country, 
    P.Value President, 
    C.Value Currency 
FROM 
    (
     SELECT DISTINCT Country 
     FROM Long 
    ) D 
      INNER JOIN 
    ( SELECT Country, Value 
     FROM Long 
     WHERE Key = 'President' 
    ) P 
      ON 
     D.Country = P.Country 
      INNER JOIN 
    ( SELECT Country, Value 
     FROM Long 
     WHERE Key = 'Currency' 
    ) C 
      ON 
     D.Country = C.Country 
ORDER BY 
    D.Country; 

और रिकार्ड के लिए, यहाँ DDL है और परीक्षण डाटा मैं उपयोग कर रहा था:

CREATE TABLE Long (ID INTEGER PRIMARY KEY AUTOINCREMENT, Country TEXT, Key TEXT, Value TEXT); 

INSERT INTO Long VALUES (NULL, 'USA', 'President', 'Obama'); 
INSERT INTO Long VALUES (NULL, 'USA', 'Currency', 'Dollar'); 
INSERT INTO Long VALUES (NULL, 'China', 'President', 'Hu'); 
INSERT INTO Long VALUES (NULL, 'China', 'Currency', 'Yuan'); 
+1

बहुत उपयोगी !! धन्यवाद - मुझे आपका दूसरा उदाहरण ग्रोक करने के लिए और अधिक समय चाहिए लेकिन यह वास्तव में मेरे एसक्यूएल ज्ञान का विस्तार करता है! – hatmatrix

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