Giới thiệu
Sử dụng UNION (mặc định loại trùng lặp) nhiều lần để gộp giá trị từ nhiều cột thành một cột kết quả, sau đó lọc NULL và sắp xếp.
1. Tạo bảng và dữ liệu
mysql> create table DemoTable (
-> Value1 int,
-> Value2 int,
-> Value3 int
-> );
Query OK, 0 rows affected (0.69 sec)
mysql> insert into DemoTable values(20,null,null);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values(20,null,null);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values(20,null,null);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(10,null,null);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values(80,20,100);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values(10,null,null);
Query OK, 1 row affected (0.16 sec)
2. Dữ liệu gốc
mysql> select *from DemoTable;
+--------+--------+--------+ | Value1 | Value2 | Value3 | +--------+--------+--------+ | 20 | NULL | NULL | | 20 | NULL | NULL | | 20 | NULL | NULL | | 10 | NULL | NULL | | 80 | 20 | 100 | | 10 | NULL | NULL | +--------+--------+--------+ 6 rows in set (0.00 sec)
3. Gộp 3 cột thành 1, loại NULL, distinct, sắp xếp
mysql> select *from
-> (
-> select Value1 as AllValue from DemoTable
-> union
-> select Value2 as AllValue from DemoTable
-> union
-> select Value3 as AllValue from DemoTable
-> ) tbl
-> where AllValue IS NOT NULL
-> order by AllValue;
Giải thích:
- Mỗi
SELECT ValueX ... UNIONgom giá trị từ một cột, tự độngDISTINCT UNION ALLgiữ trùng lặp (nhanh hơn)- Subquery
tblcho phép lọcWHERE AllValue IS NOT NULLvàORDER BYtrên kết quả gộp
4. Kết quả
+----------+ | AllValue | +----------+ | 10 | | 20 | | 80 | | 100 | +----------+ 4 rows in set (0.00 sec)
Cách thay thế (MySQL 8.0+ - LATERAL/VALUES):
SELECT DISTINCT v.val FROM DemoTable, LATERAL (VALUES ROW(Value1), ROW(Value2), ROW(Value3)) AS v(val) WHERE v.val IS NOT NULL ORDER BY v.val;
UNPIVOT (SQL Server/Oracle/PostgreSQL): MySQL chưa hỗ trợ UNPIVOT gốc.