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

สลับค่าระหว่างสองคอลัมน์ใน MySQL ด้วย User Variable

เทคนิคการสลับค่า (Swap Values)

ใน MySQL สลับค่าระหว่าง 2 คอลัมน์ในแถวเดียวได้โดยใช้ User-Defined Variable (@variable) เป็นตัวเก็บชั่วคราว

ไวยากรณ์

UPDATE table_name
SET 
    col1 = (@temp := col1),
    col1 = col2,
    col2 = @temp
WHERE condition;

ตัวอย่างสมบูรณ์

1. สร้างตารางและข้อมูล

CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Number1 INT,
    Number2 INT
);

INSERT INTO DemoTable (Number1, Number2) VALUES (10, 30);
INSERT INTO DemoTable (Number1, Number2) VALUES (60, 50);
INSERT INTO DemoTable (Number1, Number2) VALUES (110, 100);

2. ข้อมูลก่อนสลับ

SELECT * FROM DemoTable;
+----+---------+---------+
| Id | Number1 | Number2 |
+----+---------+---------+
| 1  | 10      | 30      |
| 2  | 60      | 50      |
| 3  | 110     | 100     |
+----+---------+---------+

3. สลับค่า Number1 และ Number2 ที่ Id = 2

UPDATE DemoTable
SET 
    Number1 = (@temp := Number1),
    Number1 = Number2,
    Number2 = @temp
WHERE Id = 2;

4. ผลลัพธ์หลังสลับ

SELECT * FROM DemoTable;
+----+---------+---------+
| Id | Number1 | Number2 |
+----+---------+---------+
| 1  | 10      | 30      |
| 2  | 50      | 60      |  -- สลับแล้ว
| 3  | 110     | 100     |
+----+---------+---------+

การทำงานแบบขั้นตอน

  1. @temp := Number1 - เก็บค่าเดิมของ Number1 (60) ไว้ใน @temp
  2. Number1 = Number2 - กำหนด Number1 = ค่า Number2 (50)
  3. Number2 = @temp - กำหนด Number2 = ค่าที่เก็บไว้ (60)

การสลับหลายแถวพร้อมกัน

-- สลับทุกแถว
UPDATE DemoTable
SET 
    Number1 = (@temp := Number1),
    Number1 = Number2,
    Number2 = @temp;

วิธีอื่น: ใช้ CASE (ไม่ต้อง Variable)

UPDATE DemoTable
SET 
    Number1 = CASE WHEN Id = 2 THEN Number2 ELSE Number1 END,
    Number2 = CASE WHEN Id = 2 THEN Number1 ELSE Number2 END
WHERE Id = 2;

หมายเหตุ: วิธี CASE นี้ทำงานได้เพราะ MySQL ประเมินค่า RHS ทั้งหมดก่อนจึง Assign (Atomic evaluation)

สรุป

  • ใช้ User Variable (@temp) สลับค่า 2 คอลัมน์ใน UPDATE ได้
  • ลำดับ Assignment สำคัญ: เก็บค่าเก่า → Set ค่าใหม่ → เรียกค่าเก่า
  • MySQL ประเมิน RHS ทั้งหมดก่อน Assign จึงสามารถอ้างอิงคอลัมน์เดิมใน SET เดียวกันได้