当前位置:  开发笔记 > 后端 > 正文

SQLite长到宽格式?

如何解决《SQLite长到宽格式?》经验,为你挑选了1个好方法。

我想知道是否有一种规范的方法可以在SQLite中将数据从长格式转换为宽格式(这种操作通常是在关系数据库的域中吗?).我试着按照MySQL的这个例子,但我猜SQLite没有相同的IF构造......谢谢!



1> Samuel Neff..:

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');

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有