Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: ใช้ค่า Alias ใน SELECT เดียวกันด้วย User Variable (@variable)


คำอธิบาย

ใน MySQL ไม่สามารถใช้ Alias ใน SELECT clause เดียวกันได้ ต้องใช้ User-defined Variable (@var) แทน

รูปแบบไวยากรณ์

SELECT @yourAliasName := expression AS alias1, 
       CONCAT('prefix', column, @yourAliasName) AS alias2 
FROM yourTableName;

ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable ( 
    Name varchar(40) ); 
Query OK, 0 rows affected (0.62 sec)

การเพิ่มข้อมูล

mysql> insert into DemoTable values('John Smith'); 
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Chris Brown'); 
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('David Miller'); 
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('John Doe'); 
Query OK, 1 row affected (0.18 sec)

แสดงข้อมูลทั้งหมด

mysql> select * from DemoTable;

ผลลัพธ์:

+--------------+
| Name         |
+--------------+
| John Smith   |
| Chris Brown  |
| David Miller |
| John Doe     |
+--------------+
4 rows in set (0.00 sec)

คิวรี่ใช้ Variable @todayDate

mysql> select @todayDate := curdate() as todayDate, 
concat('Mr.', Name, ' The current Date is=', @todayDate) as Result 
from DemoTable;

ผลลัพธ์

+------------+------------------------------------------------+
| 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     |
+------------+------------------------------------------------+
4 rows in set (0.00 sec)

คำอธิบาย

  1. @todayDate := curdate(): กำหนดค่า CURDATE() ให้ @todayDate และคืนค่าไปเป็น todayDate
  2. CONCAT(..., @todayDate): ใช้ @todayDate ใน Expression ตัวถัดไป
  3. Variable คงค่าเดิมตลอด Query (Evaluated ครั้งเดียวต่อแถว)

ข้อควรระวัง

  • ลำดับ Evaluation ของ SELECT ไม่รับประกัน (แต่ปกติซ้ายไปขวา)
  • ไม่ควรใช้ Variable เดียวกันทั้ง LHS และ RHS ใน Expression เดียว
  • MySQL 8.0+ แนะนำใช้ CTE (WITH) หรือ Window Function แทน

ทางเลือก: CTE (MySQL 8.0+)

WITH params AS (SELECT CURDATE() as todayDate)
SELECT todayDate, CONCAT('Mr.', Name, ' The current Date is=', todayDate) as Result
FROM DemoTable CROSS JOIN params;