> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> تُجمِّع قيم JSON وفق دلالات JSON Merge Patch، بحيث تُعتمد القيمة المكتوبة أخيرًا (last-write-wins).

# mergedJSONPatch

<h2 id="mergedJSONPatch">
  mergedJSONPatch
</h2>

أُضيف في: v26.8.0

تُجمِّع قيم JSON عبر دمجها وفق دلالات «الكتابة الأخيرة هي الغالبة» (last-write-wins)، وبذلك تُطبّق سلوك الدمج الأساسي لمعيار RFC 7396 JSON Merge Patch على مستوى المسار.

تخزّن الدالة التجميعية الحالة على شكل ثلاثيات (key, value, sorting\_key)، بحيث لا يحتفظ كل مفتاح (مسار JSON)
إلا بأحدث سجل فعّال وفقًا لـ sorting\_key. تُسطَّح عمليات كتابة الكائنات إلى
مسارات فرعية متى كان النوع `JSON` يخزّن تلك المسارات كأوراق مفردة ديناميكية. أما عمليات الكتابة غير الكائنية على المسارات الأصل،
فتحجب المسارات الفرعية المتعارضة معها.

يُعامَل كل مسار ذي نوع مُصرَّح به صراحةً (مُعرَّف باستخدام `JSON(a Map(...))` أو `JSON(a Tuple(...))` أو
`JSON(a Variant(...))` أو `JSON(a Dynamic)` وغيرها) على أنه قيمة ذرّية: إذ تُستبدَل قيمة المسار بأكملها بالتصحيح الأحدث بدلاً من دمجها دمجاً عميقاً. ولا تخضع لدلالات الدمج العميق وفق RFC 7396
إلا المسارات المفردة غير محددة النوع (الديناميكية).

يحدّد sort\_key القيمة المعتمدة لكل مسار JSON، إذ يُحتفظ بالصف الذي يحمل أكبر قيمة لـ sort\_key. وإذا تساوت مفاتيح الفرز لتصحيحين متعارضين، فإن النتيجة تتوقف على ترتيب المعالجة: إذ يُرجَّح التصحيح
الذي يُعالَج لاحقًا عند التعادل. ولا ينبغي للمستخدمين الاعتماد على `ORDER BY` لحسم حالات التعادل بشكل حتمي.

القيود (موروثة من `ColumnObject`):

1. حذف القيم الفارغة: لا يؤدي التصحيح `{"key": null}` إلى إزالة المفتاح، إذ يحذف `ColumnObject`
   الأعضاء ذات القيم الفارغة عند الإدراج، ولذلك لا تستطيع الدالة التمييز بين "المفتاح غير موجود" و
   "قيمة المفتاح null".

2. الاستبدال بكائن فارغ: لا يمكن للتصحيح `{"a": {}}` أن يحل محل قيمة مفردة أو مصفوفة أقدم
   في المسار `a`، إذ يحذف `ColumnObject` دون أي تنبيه المسارات التي تكون قيمتها كائنًا فارغًا `{}`،
   فلا يكون للتصحيح الأحدث أي أثر وتبقى القيمة القديمة كما هي.

3. غياب المسار محدد النوع من نوع غير Nullable: عندما يُعرّف عمود `JSON` مسارًا محدد النوع
   بنوع لا يقبل قيم NULL (مثل `JSON(a UInt32)`)، يُخزَّن الصف الذي يُغفل `a` بالقيمة
   الافتراضية للنوع (مثل `0`). ولا تستطيع دالة التجميع التمييز بين "غير موجود" و"مكتوب صراحةً
   بالقيمة الافتراضية"، لذا فإن التصحيح الأحدث الذي يُغفل `a` يمحو دون أي تنبيه قيمة أقدم
   غير صفرية. ولتجنب ذلك، عرّف المسارات محددة النوع بالنوع `Nullable`
   (مثل `JSON(a Nullable(UInt32))`)، إذ تُعامَل القيمة null في مسار محدد النوع يقبل قيم NULL على أنها
   "المسار غير موجود" ويجري تخطيها على النحو الصحيح.

4. جميع المسارات محددة النوع ذرية: يُخزَّن كل مسار محدد النوع (`Map(K,V)` أو `JSON` أو `Dynamic` أو `Tuple(…)`
   أو `Variant(…)` أو `Array(…)` أو أي نوع آخر مُعرَّف) كقيمة واحدة، وتستبدل
   دالة التجميع القيمة بأكملها بشكل ذري بدلًا من دمج محتوياتها دمجًا عميقًا.
   ولا يُطبَّق الدمج العميق مسارًا تلو الآخر إلا على المسارات الديناميكية (غير محددة النوع، المفردة).

5. الالتباس الناتج عن النقطة في المفتاح: يمثّل النوع `JSON` كلًا من `{"a":{"b":1}}` و`{"a.b":1}`
   بالمسار الداخلي نفسه `a.b`، ومن ثم قد يُظهر صف واحد كلًا من `a` و`a.b` بوصفهما
   نظيرين مستقلين. فعندما يكتب تصحيح أحدث `a` فقط، تمحو قاعدة التعارض بين المسار الأصل والمسار الفرعي
   `a.b`؛ وعندما يكتب `a.b` فقط، تمحو القاعدة نفسها `a`. ولتجنب ذلك،
   اضبط `json_type_escape_dots_in_keys = 1`. فمع هذا الإعداد، تُرمَّز النقاط الحرفية في مفاتيح JSON
   بترميز النسبة المئوية (مثلًا يصبح `a.b` هو `a%2Eb`)، مما يميّزها عن المسارات
   المتداخلة ويُزيل التعارض الزائف.

**الصيغة**

```sql theme={null}
mergedJSONPatch(json, sort_key)
```

**الوسيطات**

* `json` — عمود JSON المراد تجميعه. [`JSON`](/ar/reference/data-types/newjson)
* `sort_key` — عمود قابل للمقارنة يحدد عملية الكتابة التي تُعتمد لكل مسار. يُحتفَظ بالصف الذي يحمل أكبر قيمة لـ sort\_key.

**القيمة المُعادة**

تُرجع كائن JSON واحدًا ناتجًا عن دمج جميع كائنات JSON المُدخلة. [`JSON`](/ar/reference/data-types/newjson)

**أمثلة**

**الاستخدام الأساسي مع مفتاح الفرز**

```sql title=Query theme={null}
SELECT mergedJSONPatch(json, sort_key) FROM
(
    SELECT '{"a":1}'::JSON AS json, 1 AS sort_key
    UNION ALL
    SELECT '{"b":2}'::JSON, 2
    UNION ALL
    SELECT '{"a":3, "c":4}'::JSON, 3
);
```

```response title=Response theme={null}
┌─mergedJSONPatch(json, sort_key)─┐
│ {"a":3,"b":2,"c":4}             │
└─────────────────────────────────┘
```
