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