ควบคุม Data Type ของ Column Alias ด้วย CASE WHEN
MySQL มักอนุมาน Data Type ของ Expression เอง หากต้องการบังคับให้เป็นชนิดเฉพาะ (เช่น SIGNED vs UNSIGNED) ให้ใช้ CASE ร่วมกับ CAST()
สร้างตารางและข้อมูล
mysql> CREATE TABLE DemoTable1505 (
-> Value INT UNSIGNED,
-> Status TINYINT(1)
-> );
Query OK, 0 rows affected (0.47 sec)
mysql> INSERT INTO DemoTable1505 VALUES (20, 0), (45, 1);
Query OK, 2 rows affected
ข้อมูลต้นฉบับ
+-------+--------+ | Value | Status | +-------+--------+ | 20 | 0 | | 45 | 1 | +-------+--------+
คำสั่ง: บังคับให้ AllValues เป็น SIGNED (รองรับค่าลบ)
mysql> SELECT CASE Status
-> WHEN 0 THEN CAST(Value AS SIGNED) * 1
-> WHEN 1 THEN CAST(Value AS SIGNED) * -1
-> END AS AllValues
-> FROM DemoTable1505;
ผลลัพธ์
+-----------+ | AllValues | +-----------+ | 20 | | -45 | +-----------+
คำอธิบาย
Valueเป็นINT UNSIGNED(ไม่รองรับค่าลบ)CAST(Value AS SIGNED)แปลงเป็น SIGNED INT (รองรับค่าลบ)CASEคืนค่า Expression แบบมีเงื่อนไข Data Type ของผลลัพธ์จะเป็น Type ของ Branch แรกที่ Match (หรือ Type ที่ "สูงกว่า" ตามลำดับความสำคัญของ MySQL)- การคูณ
* 1และ*-1บังคับให้เป็น Numeric Context
วิธีอื่น: ใช้ CAST ภายนอก (Cleaner)
SELECT CAST(
CASE Status
WHEN 0 THEN Value
WHEN 1 THEN -Value
END AS SIGNED
) AS AllValues
FROM DemoTable1505;
ชนิดข้อมูลที่ใช้ CAST ได้
| ชนิด | คำอธิบาย |
|---|---|
SIGNED [INTEGER] | จำนวนเต็มมีเครื่องหมาย |
UNSIGNED [INTEGER] | จำนวนเต็มไม่มีเครื่องหมาย |
DECIMAL[(M[,D])] | ทศนิยมแม่นยำ |
CHAR[(N)] | สตริงความยาวคงที่ |
DATE | วันที่ |
DATETIME | วันที่เวลา |
TIME | เวลา |
BINARY[(N)] | ไบนารี |