Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Gộp giá trị distinct từ 3 cột thành 1 cột với UNION trong MySQL

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 ... UNION gom giá trị từ một cột, tự động DISTINCT
  • UNION ALL giữ trùng lặp (nhanh hơn)
  • Subquery tbl cho phép lọc WHERE AllValue IS NOT NULL và ORDER BY trê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.