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

Sử dụng giá trị alias trong cùng câu SELECT MySQL với biến user-defined

Dùng biến user-defined (@var) để tham chiếu alias trong cùng một SELECT

MySQL không cho phép dùng alias vừa định nghĩa trong cùng danh sách SELECT. Giải pháp: gán vào biến @variable rồi dùng biến đó.

1. Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (Name VARCHAR(40));
mysql> INSERT INTO DemoTable VALUES
    ('John Smith'), ('Chris Brown'), ('David Miller'), ('John Doe');

2. Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+--------------+
| Name         |
+--------------+
| John Smith   |
| Chris Brown  |
| David Miller |
| John Doe     |
+--------------+

3. Truy vấn: Gán CURDATE() vào @todayDate, dùng trong CONCAT

mysql> SELECT @todayDate := CURDATE() AS todayDate,
    CONCAT('Mr.', Name, ' The current Date is=', @todayDate) AS Result
    FROM DemoTable;

4. Kết quả (giả sử hôm nay 2019-09-08)

+------------+------------------------------------------------+
| todayDate  | Result                                         |
+------------+------------------------------------------------+
| 2019-09-08 | Mr.John Smith The current Date is=2019-09-08   |
| 2019-09-08 | Mr.Chris Brown The current Date is=2019-09-08  |
| 2019-09-08 | Mr.David Miller The current Date is=2019-09-08 |
| 2019-09-08 | Mr.John Doe The current Date is=2019-09-08     |
+------------+------------------------------------------------+

Giải thích cơ chế:

  • @todayDate := CURDATE(): Gán giá trị CURDATE() vào biến session @todayDate, đồng thời trả về giá trị đó làm cột todayDate
  • CONCAT(..., @todayDate): Sử dụng biến vừa gán trong biểu thức cùng hàng
  • Biến @todayDate giữ nguyên giá trị cho tất cả hàng (vì CURDATE() không đổi trong 1 statement)

Tại sao không dùng alias trực tiếp?

-- SAI - MySQL không hỗ trợ:
SELECT CURDATE() AS todayDate, CONCAT('Mr.', Name, ' Date=', todayDate) FROM DemoTable;

Cách chuẩn SQL (MySQL 8.0+ CTE):

WITH params AS (SELECT CURDATE() AS todayDate)
SELECT p.todayDate, CONCAT('Mr.', d.Name, ' Date=', p.todayDate)
FROM DemoTable d CROSS JOIN params p;

Lưu ý: Thứ tự đánh giá biểu thức trong SELECT không đảm bảo. Với biến, MySQL thường đánh giá trái sang phải nên an toàn. Nhưng khuyến nghị dùng CTE cho code rõ ràng, chuẩn SQL.