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