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 สำหรับค่าคงที่