Tuple هو مجموعة من العناصر، لكل عنصر فيها نوع خاص به. ويجب أن يحتوي Tuple على عنصر واحد على الأقل.
تُستخدم Tuples للتجميع المؤقت للأعمدة. ويمكن تجميع الأعمدة عند استخدام تعبير IN في استعلام، وكذلك لتحديد بعض المعلمات الصورية لدوال لامبدا. لمزيد من المعلومات، راجع قسمي عوامل التشغيل IN والدوال عالية الرتبة.
يمكن أن تكون Tuples ناتج استعلام. في هذه الحالة، في التنسيقات النصية بخلاف JSON، تُفصل القيم بفواصل داخل (). أما في تنسيقات JSON، فتُخرَج Tuples على هيئة مصفوفات (داخل []).
يمكنك استخدام دالة لإنشاء tuple:
مثال على إنشاء Tuple:
SELECT tuple(1, 'a') AS x, toTypeName(x)
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
│ (1,'a') │ Tuple(UInt8, String) │
└─────────┴───────────────────────────┘
يمكن أن يتضمن Tuple عنصرًا واحدًا
مثال:
┌─x─────┐
│ ('a') │
└───────┘
يمكن استخدام الصيغة (tuple_element1, tuple_element2) لإنشاء tuple يتكوّن من عدة عناصر دون استدعاء الدالة tuple().
مثال:
SELECT (1, 'a') AS x, (today(), rand(), 'someString') AS y, ('a') AS not_a_tuple;
┌─x───────┬─y──────────────────────────────────────┬─not_a_tuple─┐
│ (1,'a') │ ('2022-09-21',2006973416,'someString') │ a │
└─────────┴────────────────────────────────────────┴─────────────┘
عند إنشاء قيم Tuple أثناء التنفيذ، يستنتج ClickHouse أنواع وسائط Tuple على أنها أصغر أنواع يمكنها احتواء قيمة الوسيطة المقدَّمة. إذا كانت القيمة هي NULL، فسيكون النوع المستنتَج هو Nullable.
مثال على الاكتشاف التلقائي لنوع البيانات:
SELECT tuple(1, NULL) AS x, toTypeName(x)
┌─x─────────┬─toTypeName(tuple(1, NULL))──────┐
│ (1, NULL) │ Tuple(UInt8, Nullable(Nothing)) │
└───────────┴─────────────────────────────────┘
يمكن الإشارة إلى عناصر Tuple بالاسم أو برقم الفهرس:
CREATE TABLE named_tuples (`a` Tuple(s String, i Int64)) ENGINE = Memory;
INSERT INTO named_tuples VALUES (('y', 10)), (('x',-10));
SELECT a.s FROM named_tuples; -- by name
SELECT a.2 FROM named_tuples; -- by index
┌─a.s─┐
│ y │
│ x │
└─────┘
┌─tupleElement(a, 2)─┐
│ 10 │
│ -10 │
└────────────────────┘
تُقارَن قيمتا Tuple بمقارنة عناصرهما بالتتابع من اليسار إلى اليمين. فإذا كان العنصر الأول في Tuple الأولى أكبر (أصغر) من العنصر المناظر له في Tuple الثانية، عُدَّت Tuple الأولى أكبر (أصغر) من الثانية. وإلا، إذا كان العنصران متساويين، فتُقارَن القيمة التالية.
مثال:
SELECT (1, 'z') > (1, 'a') c1, (2022, 01, 02) > (2023, 04, 02) c2, (1,2,3) = (3,2,1) c3;
┌─c1─┬─c2─┬─c3─┐
│ 1 │ 0 │ 0 │
└────┴────┴────┘
أمثلة واقعية:
CREATE TABLE test
(
`year` Int16,
`month` Int8,
`day` Int8
)
ENGINE = Memory AS
SELECT *
FROM values((2022, 12, 31), (2000, 1, 1));
SELECT * FROM test;
┌─year─┬─month─┬─day─┐
│ 2022 │ 12 │ 31 │
│ 2000 │ 1 │ 1 │
└──────┴───────┴─────┘
SELECT *
FROM test
WHERE (year, month, day) > (2010, 1, 1);
┌─year─┬─month─┬─day─┐
│ 2022 │ 12 │ 31 │
└──────┴───────┴─────┘
CREATE TABLE test
(
`key` Int64,
`duration` UInt32,
`value` Float64
)
ENGINE = Memory AS
SELECT *
FROM values((1, 42, 66.5), (1, 42, 70), (2, 1, 10), (2, 2, 0));
SELECT * FROM test;
┌─key─┬─duration─┬─value─┐
│ 1 │ 42 │ 66.5 │
│ 1 │ 42 │ 70 │
│ 2 │ 1 │ 10 │
│ 2 │ 2 │ 0 │
└─────┴──────────┴───────┘
-- Let's find a value for each key with the biggest duration, if durations are equal, select the biggest value
SELECT
key,
max(duration),
argMax(value, (duration, value))
FROM test
GROUP BY key
ORDER BY key ASC;
┌─key─┬─max(duration)─┬─argMax(value, tuple(duration, value))─┐
│ 1 │ 42 │ 70 │
│ 2 │ 2 │ 0 │
└─────┴───────────────┴───────────────────────────────────────┘
Nullable(Tuple(T1, T2, …))
ميزة تجريبيةيتطلب SET enable_nullable_tuple_type = 1
هذه ميزة تجريبية.
يسمح بأن تكون الـ Tuple بأكملها NULL، بخلاف Tuple(Nullable(T1), Nullable(T2), ...) حيث يمكن فقط للعناصر الفردية أن تكون NULL.
| النوع | يمكن أن تكون Tuple بقيمة NULL | يمكن أن تكون العناصر بقيمة NULL |
|---|
Nullable(Tuple(String, Int64)) | ✅ | ❌ |
Tuple(Nullable(String), Nullable(Int64)) | ❌ | ✅ |
مثال:
SET enable_nullable_tuple_type = 1;
CREATE TABLE test (
id UInt32,
data Nullable(Tuple(String, Int64))
) ENGINE = Memory;
INSERT INTO test VALUES (1, ('hello', 42)), (2, NULL);
SELECT * FROM test WHERE data IS NULL;
┌─id─┬─data─┐
│ 2 │ ᴺᵁᴸᴸ │
└────┴──────┘