SQLite долго в широких форматах? - PullRequest
12 голосов
/ 15 марта 2010

Интересно, существует ли канонический способ преобразования данных из длинного в широкоформатный формат в SQLite (обычно это операция в области реляционных баз данных?). Я пытался следовать этому примеру для MySQL, но я думаю, что SQLite не имеет той же конструкции IF ... Спасибо!

1 Ответ

16 голосов
/ 16 марта 2010

IF - это нестандартное расширение MySQL. Лучше всегда использовать CASE, который является стандартным SQL и работает во всех совместимых базах данных, включая 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');
...