一尘不染

SQLite长到宽格式?

sql

我想知道是否有一种规范的方法可以在SQLite中将数据从长格式转换为宽格式(该操作通常在关系数据库的范围内吗?)。我尝试按照MySQL的此示例进行操作,但我想SQLite没有相同的IF构造…谢谢!


阅读 144

收藏
2021-03-17

共1个答案

一尘不染

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');
2021-03-17