مرجع سريع

ورقة غش PostgreSQL JSON و JSONB

دليل مرجعي سريع لأنواع JSON و JSONB في PostgreSQL: عوامل الاستخراج، الاحتواء، فحص الوجود، تعديل المسارات، ودوال التجميع.

· تاريخ النشر

يوفر PostgreSQL دعماً أصلياً لبيانات JSON عبر النوع json (يخزن النص كما هو) والنوع jsonb (تنسيق ثنائي مفكك يدعم فهارس GIN والبحث السريع).

عوامل الاستخراج (Extraction Operators)

السهم المفرد (-> و #>) يُرجع json/jsonb. السهم المزدوج (->> و #>>) يُرجع text.

SELECT * FROM users WHERE data->>'name' = 'John';
SELECT data->>'name' AS name FROM users;
المعامل النوع الأيسر النوع الأيمن الوصف نوع الإرجاع
-> jsonb int جلب عنصر مصفوفة بفهرس يبدأ من 0 jsonb
-> jsonb text جلب حقل كائن حسب المفتاح jsonb
#> jsonb text[] جلب قيمة في المسار المحدد jsonb
->> jsonb int جلب عنصر مصفوفة كنص text
->> jsonb text جلب حقل كائن كنص text
#>> jsonb text[] جلب قيمة في المسار المحدد كنص text

أمثلة استعلام المسارات

-- Extract nested data.address.city as text
SELECT data#>>'{address,city}' FROM customers;

-- Extract second element in items array
SELECT order_info->'items'->>1 FROM orders;

عوامل المنطق والاحتواء (نوع jsonb فقط)

-- Check if JSON object contains a specific top-level key
SELECT * FROM users WHERE data ? 'email';

-- Check if JSON contains all keys in array
SELECT * FROM users WHERE data ?& array['name', 'email'];

-- Check if JSON contains any key in array
SELECT * FROM users WHERE data ?| array['mobile', 'email'];

-- Containment: Left contains Right
SELECT * FROM users WHERE data @> '{"role": "admin"}'::jsonb;

-- Contained by: Left is contained within Right
SELECT * FROM users WHERE data <@ '{"role": "admin", "active": true}'::jsonb;

تعديل وتحديث بيانات JSONB

الدمج وحذف المفاتيح

-- Append or update key in jsonb object
UPDATE users SET data = data || '{"active": true}'::jsonb WHERE id = 1;

-- Delete key from object
UPDATE users SET data = data - 'temporary_token' WHERE id = 1;

-- Delete element from array by index
UPDATE users SET tags = tags - 1 WHERE id = 1;

-- Delete nested path
UPDATE users SET data = data #- '{profile,avatar}' WHERE id = 1;

دالة jsonb_set

-- Syntax: jsonb_set(target, path, new_value, create_missing)
UPDATE users
SET data = jsonb_set(data, '{contact,phone}', '"555-0199"', true)
WHERE id = 1;

دوال التجميع والبناء

-- Convert rows to JSON array
SELECT json_agg(u) FROM (SELECT id, name FROM users) u;

-- Build JSON object from key-value pairs
SELECT json_build_object('id', id, 'username', name) FROM users;

-- Expand JSON object to table rows
SELECT * FROM json_each('{"a": 1, "b": 2}');
-- Returns columns: key (text), value (json)

المراجع

موضوعات ذات صلة