document_cover
การใช้ where บน jsonb ใน PostgreSQL
jsonpostgresqldatabase
23 มิ.ย. 68 , 07:56
jsonb นี่มันทรงพลังมาก

สมมุติว่ามีโครงสร้างตารางแบบนี้

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 1Column 2