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ộttodayDateCONCAT(..., @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.