2013-09-29 66 views
19

Tôi có một cột với một số biến của dấu phẩy tách giá trị:SQL split dấu phẩy tách ra hàng

somethingA,somethingB,somethingC 
somethingElseA, somethingElseB 

Và tôi muốn kết quả để có mỗi giá trị, và tạo ra một hàng:

somethingA 
somethingB 
somethingC 
somethingElseA 
somethingElseB 

Làm thế nào tôi có thể làm điều này trong SQL (MySQL)?

(Tôi đã thử googling "nổ tung" và "xem bên", nhưng những người dường như không bật lên câu hỏi liên quan. Tất cả các câu hỏi liên quan để đang cố gắng làm mọi thứ phức tạp hơn nhiều)

+0

đã hỏi một lần gazillion trên SO: eghttp: //stackoverflow.com/questions/10581772/sql-server-2008-how-to-split-a-comma-separated-value-to-columns , http://stackoverflow.com/questions/13873701/convert-comma-separated-column-value-to-rows –

+1

@MitchWheat - đó không phải là câu trả lời cho câu hỏi này. Chúng có một số giá trị được phân tách bằng dấu phẩy, tôi không. –

+0

Bạn đang tìm kiếm một giải pháp SQL thuần túy, hoặc một giải pháp trong một số ngôn ngữ khác - như PHP chẳng hạn. –

Trả lời

59

Bạn có thể làm điều đó với SQL tinh khiết như thế này

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value 
    FROM table1 t CROSS JOIN 
(
    SELECT a.N + b.N * 10 + 1 n 
    FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n 
) n 
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) 
ORDER BY value 

Lưu ý: Bí quyết là để tận dụng kiểm đếm (số) bảng và rất tiện dụng trong trường hợp này MySQL chức năng SUBSTRING_INDEX(). Nếu bạn thực hiện rất nhiều truy vấn như vậy (tách) thì bạn có thể xem xét điền và sử dụng bảng kiểm đếm được duy trì thay vì tạo nó trên bay với truy vấn phụ như trong ví dụ này. Truy vấn phụ trong ví dụ này tạo ra một chuỗi các số từ 1 đến 100 một cách hiệu quả cho phép bạn chia tối đa 100 giá trị phân tách cho mỗi hàng trong bảng nguồn. Nếu bạn cần nhiều hơn hoặc ít hơn, bạn có thể dễ dàng điều chỉnh nó.

Output:

 
|   VALUE | 
|----------------| 
|  somethingA | 
|  somethingB | 
|  somethingC | 
| somethingElseA | 
| somethingElseB | 

Đây là SQLFiddle bản demo


Đây là cách truy vấn có thể nhìn với một bảng tổng sắp tiếp tục tồn tại

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value 
    FROM table1 t CROSS JOIN tally n 
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) 
ORDER BY value 

Đây là SQLFiddle demo

+1

Giải pháp thiên tài. Cảm ơn bạn. – bharatesh

+0

Câu trả lời hay, hoạt động hoàn hảo để chèn id người bạn vào bảng quan hệ người dùng (dựa trên cột có chứa friendid1, friendid2) –

+0

Hoạt động. Mẹo: Thay thế 'table1 -> [bảng của bạn]', 'giá trị -> tên trường của bạn',' giá trị -> tên trường của bạn', không có gì khác là bắt buộc. –

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