2010-03-15 9 views
11

Mi chiedo se c'è un modo canonico per convertire i dati da lungo a grande formato a SQLite (è che il funzionamento di solito nel dominio dei database relazionali?). Ho provato a seguire this example per MySQL ma immagino che SQLite non abbia lo stesso costrutto IF ... Grazie!SQLite formati da lunghi a larghi?

risposta

12

IF è un'estensione non standard di MySQL. E 'meglio usare sempre CASE che è SQL standard e funziona in tutti i database compatibili, tra cui SQLite e MySQL (e MSSQL, Oracle, Postgres, Access, Sybase ... e così via).

Ecco un esempio di come fare la stessa query con 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; 

Ecco un altro modo per rappresentare la stessa query utilizzando unisce. Penso che questo è probabilmente più efficace, ma assume c'è solo un record per ogni valore della chiave all'interno di ogni gruppo (la versione CASE non troppo, ma non si tradurrà in righe in più se questo non è vero, solo i risultati tutt'altro che prevedibile).

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; 

E per la cronaca, ecco il DDL e dati di test usavo:

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

molto utile !! Grazie - Ho bisogno di più tempo per il tuo secondo esempio, ma questo espande davvero le mie conoscenze SQL! – hatmatrix