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

จำลอง MySQL ORDER BY FIELD() ใน PostgreSQL ด้วย CASE WHEN

MySQL มีฟังก์ชัน ORDER BY FIELD(col, 'val1', 'val2', 'val3') สำหรับจัดเรียงตามลำดับที่กำหนดเอง PostgreSQL ไม่มีฟังก์ชันนี้ ต้องใช้ CASE WHEN แทน

MySQL Syntax (Original)

SELECT * FROM table_name
ORDER BY FIELD(countryName, 'IND', 'US', 'UK');

PostgreSQL Equivalent: ใช้ CASE WHEN

SELECT * FROM PostgreOrderIdDemo
ORDER BY 
    CASE 
        WHEN countryName = 'IND' THEN 1
        WHEN countryName = 'US' THEN 2
        WHEN countryName = 'UK' THEN 3
        ELSE 4
    END,
    countryName;  -- Secondary sort สำหรับค่าที่ไม่ได้ระบุ

ตัวอย่างเต็ม

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

CREATE TABLE PostgreOrderIdDemo (
    countryName VARCHAR(20)
);

INSERT INTO PostgreOrderIdDemo VALUES ('IND'), ('US'), ('UK'), ('JP'), ('CN');

2. Query เรียงลำดับ Custom

SELECT * FROM PostgreOrderIdDemo
ORDER BY 
    CASE 
        WHEN countryName = 'IND' THEN 1
        WHEN countryName = 'US' THEN 2
        WHEN countryName = 'UK' THEN 3
        ELSE 4
    END,
    countryName;

3. ผลลัพธ์

 countryName 
-------------
 IND
 US
 UK
 CN
 JP
(5 rows)

เทคนิคเพิ่มเติม

ใช้ Array Position (PostgreSQL Specific)

SELECT * FROM PostgreOrderIdDemo
ORDER BY 
    ARRAY_POSITION(ARRAY['IND','US','UK'], countryName) NULLS LAST,
    countryName;

ใช้ ENUM Type (ถ้าค่าคงที่)

CREATE TYPE country_enum AS ENUM ('IND', 'US', 'UK', 'JP', 'CN');

ALTER TABLE PostgreOrderIdDemo 
ALTER COLUMN countryName TYPE country_enum USING countryName::country_enum;

SELECT * FROM PostgreOrderIdDemo ORDER BY countryName;

สรุป

  • MySQL: ORDER BY FIELD(col, 'a','b','c')
  • PostgreSQL: ORDER BY CASE WHEN col='a' THEN 1 WHEN col='b' THEN 2 ... END
  • PostgreSQL 9.4+: ใช้ ARRAY_POSITION() ได้
  • Best: ใช้ ENUM Type สำหรับค่าคงที่