我想知道是否有一种规范的方法可以在SQLite中将数据从长格式转换为宽格式(该操作通常在关系数据库的范围内吗?)。我尝试按照MySQL的此示例进行操作,但我想SQLite没有相同的IF构造…谢谢!
IF是非标准的MySQL扩展。最好始终使用CASE标准SQL并能在所有兼容数据库中使用,包括SQLite和MySQL(以及MSSQL,Oracle,Postgres,Access,Sybase等)。
IF
CASE
这是一个如何使用进行相同查询的示例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');