2010-03-15 25 views
11

Tôi tự hỏi nếu có một cách kinh điển để chuyển đổi dữ liệu từ định dạng dài sang rộng trong SQLite (đó là hoạt động thường trong miền của cơ sở dữ liệu quan hệ?). Tôi đã cố gắng để làm theo this example cho MySQL nhưng tôi đoán SQLite không có cấu trúc IF tương tự ... Cảm ơn!SQLite từ lâu đến các định dạng rộng?

Trả lời

12

IF là tiện ích mở rộng không chuẩn của MySQL. Tốt hơn là luôn sử dụng CASE là chuẩn SQL và hoạt động trong tất cả các cơ sở dữ liệu tuân thủ, bao gồm SQLite và MySQL (và MSSQL, Oracle, Postgres, Access, Sybase ... và bật và bật).

Dưới đây là một ví dụ về cách thực hiện cùng một truy vấn với 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; 

Dưới đây là một cách khác để đại diện cho cùng một truy vấn sử dụng tham gia. Tôi nghĩ rằng điều này có thể hiệu quả hơn, nhưng nó giả định chỉ có một bản ghi cho mỗi giá trị chính trong mỗi nhóm (phiên bản CASE cũng vậy, nhưng sẽ không dẫn đến hàng bổ sung nếu điều đó không đúng, chỉ có kết quả ít hơn dự đoán được).

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; 

Và đối với những kỷ lục, đây là DDL và kiểm tra dữ liệu tôi đã sử dụng:

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

Rất hữu ích !! Cảm ơn bạn - Tôi cần thêm thời gian để tìm kiếm ví dụ thứ hai nhưng điều này thực sự mở rộng kiến ​​thức SQL của tôi! – hatmatrix

Các vấn đề liên quan