2010-03-15 17 views
11

Verileri SQLite'deki uzuntan geniş formata dönüştürmenin kanonik bir yolu olup olmadığını merak ediyorum (bu işlem genellikle ilişkisel veritabanları alanında mıdır?). MySQL için this example'u takip etmeye çalıştım ama sanırım SQLite aynı IF yapısına sahip değil ... Teşekkürler!SQLite uzuntan geniş formatlar için?

cevap

12

IF, standart olmayan bir MySQL uzantısıdır. Her zaman standart SQL olan CASE'u kullanmak daha iyidir ve SQLite ve MySQL (ve MSSQL, Oracle, Postgres, Access, Sybase ... ve on) da dahil olmak üzere tüm uyumlu veritabanlarında çalışır.

Burada CASE ile aynı sorguyu nasıl yapılacağına ilişkin bir örnek:

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; 

İşte katılır kullanarak aynı sorguyu temsil etmek başka bir yolu. Bunun muhtemelen daha verimli olduğunu düşünüyorum, ancak her gruptaki her bir anahtar değeri için sadece bir kayıt olduğunu varsayar (CASE sürümü de vardır, ancak bu doğru değilse, ekstra satırlarla sonuçlanmayacaktır, sadece tahmin edilebilir sonuçlardan daha az).

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; 

Ve kayıt için , burada DDL var ve test verileri ı kullanıyordu:

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

Çok yardımcı !! Teşekkür ederim - ikinci örneğinizi düzeltmek için daha fazla zamana ihtiyacım var ama bu gerçekten SQL bilgimi genişletiyor! – hatmatrix