* Replace underscores with hyphens * remove temporary code * fix style check * fix collapse
7.0 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | d734a8e46d |
43 | شرطی |
توابع شرطی
اگر
کنترل انشعاب مشروط. بر خلاف اکثر سیستم های تاتر همیشه هر دو عبارت را ارزیابی کنید then
و else
.
نحو
SELECT if(cond, then, else)
اگر شرایط cond
ارزیابی به یک مقدار غیر صفر, می گرداند در نتیجه بیان then
و نتیجه بیان else
, اگر در حال حاضر, قلم است. اگر cond
صفر یا NULL
سپس نتیجه then
بیان نادیده گرفته شده است و در نتیجه else
عبارت, در صورت حاضر, بازگشته است.
پارامترها
cond
– The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL.then
- بیان به بازگشت اگر شرایط ملاقات کرده است.else
- بیان به بازگشت اگر شرایط ملاقات نکرده است.
مقادیر بازگشتی
تابع اجرا می شود then
و else
عبارات و نتیجه خود را بر می گرداند, بسته به اینکه شرایط cond
به پایان رسید تا صفر یا نه.
مثال
پرسوجو:
SELECT if(1, plus(2, 2), plus(2, 6))
نتیجه:
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
پرسوجو:
SELECT if(0, plus(2, 2), plus(2, 6))
نتیجه:
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
then
وelse
باید کمترین نوع مشترک دارند.
مثال:
اینو بگیر LEFT_RIGHT
جدول:
SELECT *
FROM LEFT_RIGHT
┌─left─┬─right─┐
│ ᴺᵁᴸᴸ │ 4 │
│ 1 │ 3 │
│ 2 │ 2 │
│ 3 │ 1 │
│ 4 │ ᴺᵁᴸᴸ │
└──────┴───────┘
پرس و جو زیر مقایسه می کند left
و right
مقادیر:
SELECT
left,
right,
if(left < right, 'left is smaller than right', 'right is greater or equal than left') AS is_smaller
FROM LEFT_RIGHT
WHERE isNotNull(left) AND isNotNull(right)
┌─left─┬─right─┬─is_smaller──────────────────────────┐
│ 1 │ 3 │ left is smaller than right │
│ 2 │ 2 │ right is greater or equal than left │
│ 3 │ 1 │ right is greater or equal than left │
└──────┴───────┴─────────────────────────────────────┘
یادداشت: NULL
ارزش ها در این مثال استفاده نمی شود, بررسی ارزشهای پوچ در شرطی بخش.
اپراتور سه تایی
این همان کار می کند if
تابع.
نحو: cond ? then : else
بازگشت then
اگر cond
ارزیابی درست باشد (بیشتر از صفر), در غیر این صورت بازده else
.
-
cond
باید از نوع باشدUInt8
وthen
وelse
باید کمترین نوع مشترک دارند. -
then
وelse
می تواند باشدNULL
همچنین نگاه کنید به
چندف
اجازه می دهد تا شما را به نوشتن CASE اپراتور فشرده تر در پرس و جو.
نحو: multiIf(cond_1, then_1, cond_2, then_2, ..., else)
پارامترها:
cond_N
— The condition for the function to returnthen_N
.then_N
— The result of the function when executed.else
— The result of the function if none of the conditions is met.
تابع می پذیرد 2N+1
پارامترها
مقادیر بازگشتی
تابع یکی از مقادیر را برمی گرداند then_N
یا else
, بسته به شرایط cond_N
.
مثال
دوباره با استفاده از LEFT_RIGHT
جدول
SELECT
left,
right,
multiIf(left < right, 'left is smaller', left > right, 'left is greater', left = right, 'Both equal', 'Null value') AS result
FROM LEFT_RIGHT
┌─left─┬─right─┬─result──────────┐
│ ᴺᵁᴸᴸ │ 4 │ Null value │
│ 1 │ 3 │ left is smaller │
│ 2 │ 2 │ Both equal │
│ 3 │ 1 │ left is greater │
│ 4 │ ᴺᵁᴸᴸ │ Null value │
└──────┴───────┴─────────────────┘
با استفاده از نتایج شرطی به طور مستقیم
شرطی همیشه به نتیجه 0
, 1
یا NULL
. بنابراین شما می توانید نتایج شرطی به طور مستقیم مثل این استفاده کنید:
SELECT left < right AS is_small
FROM LEFT_RIGHT
┌─is_small─┐
│ ᴺᵁᴸᴸ │
│ 1 │
│ 0 │
│ 0 │
│ ᴺᵁᴸᴸ │
└──────────┘
ارزشهای پوچ در شرطی
زمانی که NULL
ارزش ها در شرطی درگیر, نتیجه نیز خواهد بود NULL
.
SELECT
NULL < 1,
2 < NULL,
NULL < NULL,
NULL = NULL
┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────────┴───────────────┴──────────────────┴────────────────────┘
بنابراین شما باید نمایش داده شد خود را با دقت ساخت اگر انواع هستند Nullable
.
مثال زیر نشان می دهد این شکست برای اضافه کردن شرایط برابر به multiIf
.
SELECT
left,
right,
multiIf(left < right, 'left is smaller', left > right, 'right is smaller', 'Both equal') AS faulty_result
FROM LEFT_RIGHT
┌─left─┬─right─┬─faulty_result────┐
│ ᴺᵁᴸᴸ │ 4 │ Both equal │
│ 1 │ 3 │ left is smaller │
│ 2 │ 2 │ Both equal │
│ 3 │ 1 │ right is smaller │
│ 4 │ ᴺᵁᴸᴸ │ Both equal │
└──────┴───────┴──────────────────┘