تعمل الدوال الحسابية على أي معاملين من النوع UInt8 أو UInt16 أو UInt32 أو UInt64 أو Int8 أو Int16 أو Int32 أو Int64 أو Float32 أو Float64.
قبل تنفيذ العملية، يُحوَّل كلا المعاملين إلى نوع النتيجة. ويُحدَّد نوع النتيجة على النحو التالي (ما لم يُذكر
خلاف ذلك في توثيق الدالة أدناه):
- إذا كان عرض كلا المعاملين لا يتجاوز 32 بت، فسيكون حجم نوع النتيجة هو حجم النوع الأكبر التالي بعد أكبر
المعاملين (ترقية حجم الأعداد الصحيحة). على سبيل المثال،
UInt8 + UInt16 = UInt32 أو Float32 * Float32 = Float64.
- إذا كان أحد المعاملين بعرض 64 بت أو أكثر، فسيكون حجم نوع النتيجة مساوياً لحجم أكبر
المعاملين. على سبيل المثال،
UInt32 + UInt128 = UInt128 أو Float32 * Float64 = Float64.
- إذا كان أحد المعاملين موقَّعاً، فسيكون نوع النتيجة موقَّعاً أيضاً، وإلا فسيكون غير موقَّع. على سبيل المثال،
UInt32 * Int32 = Int64 أو UInt32 * UInt32 = UInt64.
تضمن هذه القواعد أن يكون نوع النتيجة أصغر نوع يمكنه تمثيل جميع النتائج الممكنة. ومع أن هذا يضيف احتمال
حدوث تجاوز عددي عند حدود نطاق القيم، فإنه يضمن تنفيذ العمليات الحسابية بسرعة باستخدام أكبر عرض أصلي
للأعداد الصحيحة، وهو 64 بت. كما يضمن هذا السلوك التوافق مع العديد من قواعد البيانات الأخرى التي توفّر أعداداً صحيحة بطول 64 بت (BIGINT) باعتبارها أكبر نوع
للأعداد الصحيحة.
مثال:
SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)
┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8 │ UInt16 │ UInt32 │ UInt64 │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘
تحدث حالات تجاوز السعة بالطريقة نفسها كما في C++.
قُدِّمت في: v1.1.0
تحسب القيمة المطلقة لـ x. ولا يكون لها أي تأثير إذا كان x من نوع غير موقَّع. أما إذا كان x من نوع موقَّع، فإنها تُرجع عددًا غير موقَّع.
البنية
الوسائط
x — القيمة المطلقة المطلوب حسابها لـ x
القيمة المُعادة
القيمة المطلقة لـ x
أمثلة
مثال للاستخدام
أُضيف في: v25.11.0
يحسب ويُرجع متوسط قيمة المعاملات المُدخلة.
يدعم الأنواع العددية والزمنية.
البنية
الوسائط
x1, x2] — يقبل قيمتين لحساب المتوسط.
القيمة المُعادة
تُرجِع متوسط قيم الوسائط المقدَّمة، مع ترقية النوع إلى أكبر نوع متوافق.
أمثلة
الأنواع العددية
SELECT avg2(toUInt8(3), 1.0) AS result, toTypeName(result) AS type;
-- The type returned is a Float64 as the UInt8 must be promoted to 64 bit for the comparison.
┌─result─┬─type────┐
│ 2 │ Float64 │
└────────┴─────────┘
الأنواع العشرية
SELECT avg2(toDecimal32(1, 2), 2) AS result, toTypeName(result) AS type;
┌─result─┬─type──────────┐
│ 1.5 │ Decimal(9, 2) │
└────────┴───────────────┘
أنواع Date
SELECT avg2(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;
┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘
أنواع DateTime
SELECT avg2(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;
┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘
أنواع Time64
SELECT avg2(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;
┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘
طُرحت في: v23.10.0
تعكس هذه الدالة بايتات عدد صحيح، أي تغيّر ترتيب البايتات الخاص به.
يمكن توضيح المثال أدناه على النحو التالي:
- حوِّل العدد الصحيح ذي الأساس 10 إلى ما يقابله بالتنسيق السداسي العشري وبترتيب big-endian، أي 3351772109 -> C7 C7 FB CD (4 بايتات)
- اعكس البايتات، أي C7 C7 FB CD -> CD FB C7 C7
- حوِّل النتيجة مرة أخرى إلى عدد صحيح بافتراض ترتيب big-endian، أي CD FB C7 C7 -> 3455829959
من حالات استخدام هذه الدالة عكس عناوين IPv4:
┌─toIPv4(byteSwap(toUInt32(toIPv4('205.251.199.199'))))─┐
│ 199.199.251.205 │
└───────────────────────────────────────────────────────┘
الصيغة
المعاملات
القيمة المُعادة
تُرجع x بعد عكس ترتيب البايتات. (U)Int*
أمثلة
مثال على الاستخدام
SELECT byteSwap(3351772109)
8-بت
16 بت
32 بت
SELECT byteSwap(3351772109)
64 بت
SELECT byteSwap(123294967295)
أُضيف في: v1.1.0
يحسب ناتج قسمة القيمتين a وb. ويكون نوع النتيجة دائمًا Float64.
وتوفّر الدالة intDiv القسمة الصحيحة.
تؤدي القسمة على 0 إلى إرجاع inf أو -inf أو nan.
البنية
المعاملات
x — المقسوم - y — المقسوم عليه
القيمة المُعادة
ناتج قسمة x على y
أمثلة
قسمة عددين
SELECT divide(25,5) AS quotient, toTypeName(quotient)
القسمة على صفر
متاح منذ: v22.12.0
يجري قسمة عددين عشريين. تكون القيمة الناتجة من النوع Decimal256.
يمكن تحديد مقياس النتيجة صراحةً باستخدام الوسيط result_scale (عدد صحيح ثابت ضمن النطاق [0, 76]). وإذا لم يُحدَّد، فسيكون مقياس النتيجة هو أكبر مقياس بين الوسيطات المُعطاة.
تعمل هذه الدالة بسرعة أبطأ بكثير من divide الاعتيادية.
إذا لم تكن بحاجة فعلًا إلى دقة مضبوطة و/أو كنت تحتاج إلى حساب سريع، ففكّر في استخدام divide.
الصياغة
divideDecimal(x, y[, result_scale])
الوسائط
القيمة المُعادة
ناتج القسمة بالمقياس المحدد. Decimal256
أمثلة
مثال 1
divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)
┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐
│ -5.7142857142 │
└──────────────────────────────────────────────────────────────┘
مثال 2
SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1);
SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5);
┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐
│ -5.7 │
└──────────────────────────────────────────────────┘
┌───a─┬───b─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 5)─┐
│ -12 │ 2.1 │ -5.7 │ -5.71428 │
└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘
أُضيفت في: v25.5.0
مماثلة لـ divide، لكنها تُرجع NULL عند القسمة على صفر.
الصياغة
الوسيطات
x — المقسوم - y — المقسوم عليه
القيمة المُعادة
حاصل قسمة x على y، أو NULL.
أمثلة
القسمة على صفر
SELECT divideOrNull(25, 0)
قُدِّمت في: v1.1.0
تُرجِع القاسم المشترك الأكبر للقيمتين a و b.
يُطرَح استثناء عند القسمة على الصفر أو عند قسمة
أصغر عدد سالب على سالب واحد.
البنية
الوسيطات
x — العدد الصحيح الأول - y — العدد الصحيح الثاني
القيمة المُعادة
القاسم المشترك الأكبر لـ x و y.
أمثلة
مثال على الاستخدام
أُضيفت في: v20.3.0
يتحقق مما إذا كانت قيمة الفاصلة العائمة منتهية.
يمكنك الحصول على نتيجة مماثلة باستخدام المعامل الثلاثي: isFinite(x) ? x : y.
الصيغة
الوسائط
x — القيمة المراد التحقق مما إذا كانت لا نهائية. Float*
y — القيمة البديلة. Float*
القيمة المُعادة
x إذا كانت x منتهية.
y إذا كانت x غير منتهية.
أمثلة
مثال على الاستخدام
SELECT 1/0 AS infimum, ifNotFinite(infimum,42)
أُضيفت في: v1.1.0
تُجري قسمةً صحيحة للقيمتين x وy. وبعبارة أخرى،
تحسب خارج القسمة مع التقريب إلى الأسفل إلى أقرب عدد صحيح أصغر.
تكون النتيجة بنفس عرض المقسوم (المعلَمة الأولى).
يُثار استثناء عند القسمة على الصفر، أو عندما لا يقع خارج القسمة ضمن
نطاق المقسوم، أو عند قسمة أصغر عدد سالب ممكن على سالب واحد.
الصياغة
الوسيطات
x — المعامل الأيسر. - y — المعامل الأيمن.
القيمة المُعادة
ناتج القسمة الصحيحة لـ x على y
أمثلة
القسمة الصحيحة لعددين من النوع Float
SELECT intDiv(toFloat64(1), 0.001) AS res, toTypeName(res)
┌──res─┬─toTypeName(intDiv(toFloat64(1), 0.001))─┐
│ 1000 │ Int64 │
└──────┴─────────────────────────────────────────┘
ناتج القسمة لا يقع ضمن نطاق المقسوم
SELECT
intDiv(1, 0.001) AS res,
toTypeName(res)
Received exception from server (version 23.2.1):
Code: 153. DB::Exception: Received from localhost:9000. DB::Exception:
Cannot perform integer division, because it will produce infinite or too
large number: While processing intDiv(1, 0.001) AS res, toTypeName(res).
(ILLEGAL_DIVISION)
تم تقديمه في: v25.5.0
مماثلة لـ intDiv، لكنها تُرجع NULL عند القسمة على صفر أو عند قسمة
أصغر عدد سالب على سالب واحد.
الصياغة
الوسيطات
القيمة المُعادة
ناتج القسمة الصحيحة لـ x و y، أو NULL.
أمثلة
القسمة الصحيحة على الصفر
SELECT intDivOrNull(1, 0)
قسمة أصغر عدد سالب على -1
SELECT intDivOrNull(-9223372036854775808, -1)
أُضيفت في: v1.1.0
مماثلة لـ intDiv، لكنها تُرجِع صفرًا عند القسمة على صفر أو عند قسمة
أصغر عدد صحيح سالب ممكن على سالب واحد.
البنية
المعاملات
القيمة المُعادة
ناتج القسمة الصحيحة للعددين a وb، أو صفر.
أمثلة
القسمة الصحيحة على صفر
SELECT intDivOrZero(1, 0)
قسمة أصغر عدد سالب على -1
SELECT intDivOrZero(0.05, -1)
أُضيفت في: v1.1.0
تُرجع 1 إذا كانت الوسيطة من النوع Float32 أو Float64 أو BFloat16 غير لانهائية وليست NaN،
وإلا فستُرجع هذه الدالة 0.
البنية
الوسيطات
القيمة المُعادة
1 إذا لم تكن قيمة x غير متناهية ولم تكن NaN، وإلا فالقيمة 0.
أمثلة
اختبر ما إذا كان العدد متناهيًا
أُضيف في: v1.1.0
تُعيد 1 إذا كانت الوسيطة من النوع Float32 أو Float64 أو BFloat16 قيمةً لا نهائية، وإلا فتُعيد هذه الدالة 0.
لاحظ أن القيمة 0 تُعاد أيضًا في حالة NaN.
البنية
الوسيطات
القيمة المُعادة
1 إذا كان x لا نهائيًا، وإلا 0 (بما في ذلك NaN).
أمثلة
التحقق مما إذا كان العدد لا نهائيًا
SELECT isInfinite(inf), isInfinite(NaN), isInfinite(10))
أُضيفت في: v1.1.0
تعيد 1 إذا كانت الوسيطة من النوع Float32 أو Float64 أو BFloat16 تساوي NaN، وإلا فتعيد 0.
الصياغة
الوسائط
القيمة المعادة
1 إذا كانت القيمة NaN، وإلا 0
أمثلة
مثال على الاستخدام
استُحدثت في: v1.1.0
تعيد المضاعف المشترك الأصغر للقيمتين x وy.
يُثار استثناء عند القسمة على صفر أو عند قسمة أصغر عدد سالب ممكن على سالب واحد.
البنية
المعاملات
القيمة المُعادة
يعيد المضاعف المشترك الأصغر لـ x وy. (U)Int*
أمثلة
مثال على الاستخدام
تم تقديمه في: v21.11.0
يعيد القيمة الأكبر بين قيمتين رقميتين x وy.
الصيغة
الوسيطات
القيمة المُعادة
تُرجِع أكبر القيمتين x وy. Float64
أمثلة
مثال للاستخدام
قُدِّمت في: v25.11.0
تحسب وتُرجع متوسط قيمة الوسيطات المُقدَّمة.
تدعم الأنواع العددية والزمنية.
البنية
الوسائط
x1[, x2, ...] — تقبل قيمة واحدة أو عدة قيم لحساب المتوسط.
القيمة المُعادة
تعيد متوسط قيم الوسائط المُدخلة، مع ترقية النوع إلى أكبر نوع متوافق.
أمثلة
الأنواع العددية
SELECT midpoint(1, toUInt8(3), 0.5) AS result, toTypeName(result) AS type;
-- The type returned is a Float64 as the UInt8 must be promoted to 64 bit for the comparison.
┌─result─┬─type────┐
│ 1.5 │ Float64 │
└────────┴─────────┘
أنواع الأعداد العشرية
SELECT midpoint(toDecimal32(1.5, 2), toDecimal32(1, 1), 2) AS result, toTypeName(result) AS type;
┌─result─┬─type──────────┐
│ 1.5 │ Decimal(9, 2) │
└────────┴───────────────┘
أنواع Date
SELECT midpoint(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;
┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘
أنواع DateTime
SELECT midpoint(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;
┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘
أنواع Time64
SELECT midpoint(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;
┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘
أُضيف في: v21.11.0
يُرجع القيمة الأصغر من بين القيمتين العدديتين x وy.
الصيغة
الوسيطات
القيمة المُعادة
تعيد أصغر القيمتين x وy. Float64
أمثلة
مثال على الاستخدام
أُضيف في: v1.1.0
يحسب الفرق بين القيمتين a وb. تكون النتيجة دائمًا موقَّعة.
وكما في plus، يمكن طرح عدد صحيح من تاريخ أو تاريخ مع وقت.
بالإضافة إلى ذلك، يُدعَم الطرح بين قيمتَي تاريخ مع وقت، وينتج عنه الفرق الزمني بينهما.
البنية
الوسيطات
x — المطروح منه. - y — المطروح.
القيمة المعادة
x ناقص y
أمثلة
طرح عددين
طرح عدد صحيح من تاريخ
SELECT minus(toDate('2025-01-01'),5)
أُضيف في: v1.1.0
يحسب باقي قسمة القيمتين a وb.
يكون نوع النتيجة عددًا صحيحًا إذا كان كلا المُدخلين عددين صحيحين. وإذا كان أحد
المُدخلين عددًا ذا فاصلة عائمة، فسيكون نوع النتيجة Float64.
يُحسب الباقي كما في C++. وتُستخدم
القسمة المبتورة مع الأعداد السالبة.
يُطلق استثناء عند القسمة على الصفر أو عند قسمة أصغر
عدد سالب على سالب واحد.
البنية
الأسماء البديلة: mod
الوسائط
a — المقسوم - b — المقسوم عليه (الموديولس)
القيمة المُعادة
الباقي من a % b
أمثلة
مثال على الاستخدام
قُدِّم في: v1.1.0
يحسب باقي القسمة. هذا هو التنفيذ القديم لـ modulo الذي يستخدم العامل % في C++، وقد يُنتج نتائج سالبة عند استخدام وسيطات سالبة. وُجدت هذه الدالة للحفاظ على التوافق مع الإصدارات السابقة لمنطق تقسيم الجدول القديم. استخدم modulo أو positiveModulo للحصول على السلوك القياسي.
الصياغة
الوسيطات
القيمة المُعادة
تعيد ناتج باقي القسمة. (U)Int* أو Float*
أمثلة
الاستخدام الأساسي
SELECT moduloLegacy(10, 3)
أُضيف في: v25.5.0
يحسب remainder عند قسمة a على b. وهو مشابه للدالة modulo، إلا أن moduloOrNull تُرجع NULL
إذا كانت الوسيطة اليمنى تساوي 0.
البنية
الأسماء البديلة: modOrNull
المعاملات
القيمة المُعادة
تعيد ناتج باقي قسمة x على y، أو NULL إذا كان القاسم صفراً.
أمثلة
moduloOrNull عندما يكون القاسم صفراً
SELECT moduloOrNull(5, 0)
استُحدثت في: v20.3.0
تشبه modulo، لكنها تُرجع صفرًا عندما يكون القاسم صفرًا، بدلًا من إرجاع
استثناء كما في الدالة modulo.
البنية
الوسيطات
القيمة المعادة
ترجع باقي قسمة a % b، أو 0 إذا كان المقسوم عليه 0.
أمثلة
مثال على الاستخدام
SELECT moduloOrZero(5, 0)
متوفرة منذ: v1.1.0
يحسب حاصل ضرب القيمتين x وy.
الصيغة
المعاملات
القيمة المُعادة
يعيد ناتج ضرب x في y
أمثلة
ضرب عددين
أُضيف في: v22.12.0
يُجري عملية ضرب على عددين من النوع Decimal. ستكون قيمة النتيجة من النوع Decimal256.
يمكن تحديد مقياس النتيجة صراحةً باستخدام الوسيط result_scale (عدد صحيح ثابت ضمن النطاق [0, 76]). وإذا لم يُحدَّد، فسيكون مقياس النتيجة هو أكبر مقياس بين الوسيطات المُعطاة.
تعمل هذه الدوال أبطأ بكثير من multiply العادية.
إذا لم تكن بحاجة فعلًا إلى دقة مضبوطة و/أو كنت تحتاج إلى حسابات سريعة، ففكّر في استخدام multiply
البنية
multiplyDecimal(a, b[, result_scale])
المعاملات
a — القيمة الأولى. Decimal
b — القيمة الثانية. Decimal
result_scale — عدد المنازل العشرية في النتيجة. (U)Int*
القيمة المعادة
ناتج الضرب بعدد المنازل العشرية المحدد. النوع: Decimal256
أمثلة
مثال على الاستخدام
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
الاختلاف عن الضرب العادي
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609633 │
└───────────────────────────────────────────────────────────┘
┌─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609 │
└──────────────────────────────────────────────────────────────────┘
فيض Decimal
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
multiplyDecimal(a, b);
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
a * b;
┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐
│ -12.647987876 │ 123.967645643 │ -1567.941279108 │
└───────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────┘
Received exception from server (version 22.11.1):
Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal math overflow:
While processing toDecimal64(-12.647987876, 9) AS a, toDecimal64(123.967645643, 9) AS b, a * b. (DECIMAL_OVERFLOW)
تمت إضافته في: v1.1.0
يُرجِع نفي الوسيطة x. وتكون النتيجة دائمًا من نوع موقَّع.
الصيغة
الوسائط
x — القيمة المطلوب عكس إشارتها.
القيمة المعادة
يُرجع القيمة -x عند إدخال x
أمثلة
مثال على الاستخدام
أُضيفت في: v1.1.0
تحسب مجموع القيمتين x وy. الاسم البديل: x + y (المعامل).
يمكن أيضًا جمع عدد صحيح مع تاريخ أو تاريخ مع وقت. تزيد العملية الأولى
عدد الأيام في التاريخ، بينما تزيد العملية الثانية
عدد الثواني في التاريخ مع الوقت.
ويمكن أيضًا جمع تاريخ ووقت. تؤدي إضافة Date وTime
إلى إنتاج DateTime. كما تؤدي إضافة Date وTime64، أو Date32 و
Time أو Time64، إلى إنتاج DateTime64.
الصياغة
المعاملات
x — المعامل في الطرف الأيسر. - y — المعامل في الطرف الأيمن.
القيمة المُعادة
تُرجع مجموع x و y
أمثلة
جمع عددين
إضافة عدد صحيح إلى تاريخ
SELECT plus(toDate('2025-01-01'),5)
إضافة تاريخ ووقت
SELECT toDate('2025-01-01') + CAST('14:30:25', 'Time')
أُضيفت في: v22.11.0
تحسب الباقي عند قسمة x على y. وهي مشابهة للدالة
modulo، إلا أن positiveModulo تعيد دائمًا عددًا غير سالب.
الصيغة
الأسماء البديلة: positive_modulo, pmod
الوسيطات
القيمة المُعادة
تعيد الفرق بين x وأكبر عدد صحيح لا يتجاوز
x ويقبل القسمة على y.
أمثلة
مثال على الاستخدام
SELECT positiveModulo(-1, 10)
تم تقديمها في: v25.5.0
تحسب الباقي عند قسمة a على b. وهي مشابهة للدالة positiveModulo، باستثناء أن positiveModuloOrNull تُرجِع NULL
إذا كان المعامل الأيمن يساوي 0.
الصياغة
positiveModuloOrNull(x, y)
الأسماء البديلة: positive_modulo_or_null, pmodOrNull
الوسائط
القيمة المُعادة
تعيد الفرق بين x وأقرب عدد صحيح لا يزيد عن
x ويقبل القسمة على y، وتُعيد null عندما يكون القاسم صفراً.
أمثلة
positiveModuloOrNull
SELECT positiveModuloOrNull(5, 0)