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

บังคับให้ Column Alias เป็นชนิดข้อมูลเฉพาะใน MySQL ด้วย CASE และ CAST

ควบคุม 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 ได้

กรณีใช้งานจริง

  • ป้องกัน Overflow เมื่อคำนวณค่าลบจาก UNSIGNED Column
  • บังคับ Sorting ให้ถูกต้อง (UNSIGNED เรียง -1 เป็นค่ามากที่สุด)
  • Relative compatibility กับ Application ที่คาดหวัง Type เฉพาะ
ชนิดคำอธิบาย
SIGNED [INTEGER]จำนวนเต็มมีเครื่องหมาย
UNSIGNED [INTEGER]จำนวนเต็มไม่มีเครื่องหมาย
DECIMAL[(M[,D])]ทศนิยมแม่นยำ
CHAR[(N)]สตริงความยาวคงที่
DATEวันที่
DATETIMEวันที่เวลา
TIMEเวลา
BINARY[(N)]ไบนารี