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