الانتقال إلى المحتوى الرئيسي
مصفوفة من عناصر من النوع T، ويبدأ فهرسها من 1. ويمكن أن يكون T أي نوع بيانات، بما في ذلك المصفوفة.

إنشاء Array

يمكنك استخدام دالة لإنشاء Array:
array(T)
يمكنك أيضًا استخدام [].
[]
مثال على إنشاء مصفوفة:
SELECT array(1, 2) AS x, toTypeName(x)
┌─x─────┬─toTypeName(array(1, 2))─┐
│ [1,2] │ Array(UInt8)            │
└───────┴─────────────────────────┘
SELECT [1, 2] AS x, toTypeName(x)
┌─x─────┬─toTypeName([1, 2])─┐
│ [1,2] │ Array(UInt8)       │
└───────┴────────────────────┘

العمل مع أنواع البيانات

عند إنشاء مصفوفة مباشرةً، يحدّد ClickHouse تلقائيًا نوع الوسائط على أنه أضيق نوع بيانات يمكنه تخزين جميع الوسائط المُدرجة. وإذا وُجدت أي قيم Nullable أو قيم NULL حرفية، فإن نوع عنصر المصفوفة يصبح أيضًا Nullable. إذا لم يتمكن ClickHouse من تحديد نوع البيانات، فإنه يُنشئ استثناءً. ويحدث هذا، على سبيل المثال، عند محاولة إنشاء مصفوفة تضم سلاسل نصية وأرقامًا في الوقت نفسه (SELECT array(1, 'a')). أمثلة على الاكتشاف التلقائي لأنواع البيانات:
SELECT array(1, 2, NULL) AS x, toTypeName(x)
┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐
│ [1,2,NULL] │ Array(Nullable(UInt8))        │
└────────────┴───────────────────────────────┘
إذا حاولت إنشاء مصفوفة من أنواع بيانات غير متوافقة، فسيُصدر ClickHouse استثناءً:
SELECT array(1, 'a')
Received exception from server (version 1.1.54388):
Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.

حجم المصفوفة

يمكن معرفة حجم المصفوفة باستخدام العمود الفرعي size0 من دون قراءة العمود بالكامل. وبالنسبة إلى المصفوفات متعددة الأبعاد، يمكنك استخدام sizeN-1، حيث تمثل N البُعد المطلوب. مثال
Query
CREATE TABLE t_arr (`arr` Array(Array(Array(UInt32)))) ENGINE = MergeTree ORDER BY tuple();

INSERT INTO t_arr VALUES ([[[12, 13, 0, 1],[12]]]);

SELECT arr.size0, arr.size1, arr.size2 FROM t_arr;
Response
┌─arr.size0─┬─arr.size1─┬─arr.size2─┐
│         1 │ [2]       │ [[4,1]]   │
└───────────┴───────────┴───────────┘

قراءة الأعمدة الفرعية المتداخلة من Array

إذا كان النوع المتداخل T داخل Array يحتوي على أعمدة فرعية (على سبيل المثال، إذا كان Tuple مُسمّى)، فيمكنك قراءة أعمدته الفرعية من نوع Array(T) باستخدام أسماء الأعمدة الفرعية نفسها. ويكون نوع العمود الفرعي هو Array من نوع العمود الفرعي الأصلي. مثال
CREATE TABLE t_arr (arr Array(Tuple(field1 UInt32, field2 String))) ENGINE = MergeTree ORDER BY tuple();
INSERT INTO t_arr VALUES ([(1, 'Hello'), (2, 'World')]), ([(3, 'This'), (4, 'is'), (5, 'subcolumn')]);
SELECT arr.field1, toTypeName(arr.field1), arr.field2, toTypeName(arr.field2) from t_arr;
┌─arr.field1─┬─toTypeName(arr.field1)─┬─arr.field2────────────────┬─toTypeName(arr.field2)─┐
│ [1,2]      │ Array(UInt32)          │ ['Hello','World']         │ Array(String)          │
│ [3,4,5]    │ Array(UInt32)          │ ['This','is','subcolumn'] │ Array(String)          │
└────────────┴────────────────────────┴───────────────────────────┴────────────────────────┘
آخر تعديل في ٢٥ يونيو ٢٠٢٦