Je me demande s'il existe une façon canonique de convertir des données de format long en format large dans SQLite (cette opération est-elle habituellement dans le domaine des bases de données relationnelles?). J'ai essayé de suivre this example pour MySQL mais je suppose que SQLite n'a pas la même construction IF ... Merci!SQLite longs à larges formats?
Répondre
IF
est une extension MySQL non standard. Il est préférable de toujours utiliser CASE
qui est standard SQL et fonctionne dans toutes les bases de données compatibles, y compris SQLite et MySQL (et MSSQL, Oracle, Postgres, Access, Sybase ... et ainsi de suite).
Voici un exemple de la façon de faire la même requête avec 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;
Voici une autre façon de représenter la même requête avec des jointures. Je pense que cela est probablement plus efficace, mais il suppose qu'il n'y a qu'un seul enregistrement pour chaque valeur de clé dans chaque groupe (la version CASE
aussi, mais n'aboutira pas à des lignes supplémentaires si ce n'est pas vrai, juste des résultats moins prévisibles).
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;
pour le compte rendu, voici le DDL et les données de test que j'utilisais:
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. Python/SQLite - base de données verrouillée malgré de longs délais
- 2. Multiplier deux longs longs C
- 3. Formats de base de données pris en charge par SQLite?
- 4. Boost.format et caractères larges
- 5. ggplot geom_bar - barres trop larges
- 6. C++: caractères larges générés incorrectement?
- 7. Modulo avec longs entiers longs dans Objective C
- 8. GCC prend-il en charge les longs longs int?
- 9. ListBox éléments longs conseils
- 10. Excel avec des polices japonaises (larges)
- 11. simplificatrices larges, tables non normalisées dans Rails
- 12. Des tables très larges dans LaTeX
- 13. Scripts longs et documents ouverts
- 14. heightForRowAtIndexPath pour NSStrings plus longs
- 15. Listes d'initialisation de constructeurs longs
- 16. comprendre l'anatomie des formats de fichiers et des formats d'image
- 17. Différents formats de résultats
- 18. convertir des formats vidéo
- 19. formats datetime SQL conversion
- 20. Formats de date Silverlight
- 21. Mise à jour de NText provoquant de longs délais/délais
- 22. Créer automatiquement des répertoires à partir de chemins longs
- 23. Type Formats d'image
- 24. Formats Django requis
- 25. SQLite - valeur à portée
- 26. SQLite à ListActivity
- 27. objet SQLite à NSMutableArray
- 28. Lecture de longs fichiers ASCII dans C
- 29. Traiter les processus longs dans ASP.NET
- 30. Convertir des chemins courts (8.3) en longs?
Très utile !! Merci - J'ai besoin de plus de temps pour enrichir votre deuxième exemple mais cela élargit vraiment mes connaissances SQL! – hatmatrix