สมมุติว่ามีโครงสร้างตารางแบบนี้
CREATE TABLE oh_my_table (
my_id serial4 NOT NULL,
my_data jsonb NULL
);กรณีเป็น array ทั่วๆไป
เช่นข้อมูลที่หน้าตาประมาณนี้
my_data: [1000, 1001, 1002, 1003]ถ้าต้องการค้นหาว่า มี ค่า 1001 อยู่ภายใน my_data มั้ยให้ทำอย่างงี้ครับ
-- ใช้ ? เพื่อตรวจสอบว่ามีค่า 2000 อยู่ใน JSONB array หรือไม่
SELECT *
FROM oh_my_table
WHERE my_data ? '1001';
-- หรือใช้ @> เพื่อตรวจสอบว่า JSONB array มี array ที่มีค่า 1001 หรือไม่
SELECT *
FROM oh_my_table
WHERE my_data @> '[1001]'::jsonb;กรณีที่เป็น Object Array
เช่น มีข้อมูลหน้าตาประมาณนี้
my_data: [{id: 1000},{id: 1001},{id: 1002},{id: 1003}]วิธีจะค้นหาว่ามีค่า 1001 อยู่มั้ย จะเริ่มซับซ้อนกว่าเดิมแล้วครับ
-- วิธีที่ 1: ใช้ Comma-join (ทำงานคล้าย LATERAL)
SELECT t.*
FROM oh_my_table t,
jsonb_array_elements(t.my_data) AS obj
WHERE (obj ->> 'id')::int = 1001;
-- วิธีที่ 2: ใช้ LATERAL JOIN (เป็นวิธีที่ชัดเจนและแนะนำสำหรับกรณีที่ซับซ้อนขึ้น)
SELECT t.*
FROM oh_my_table t
LEFT JOIN LATERAL jsonb_array_elements(t.my_data) AS obj ON TRUE
WHERE (obj ->> 'id')::int = 1001;Operator ที่น่าสนใจ
Operator สำหรับดึงข้อมูลออกมา
| Column 1 | Column 2 |
|---|---|
