2020-03-30 12:48:55 +00:00
---
machine_translated: true
2020-05-15 04:34:54 +00:00
machine_translated_rev: 72537a2d527c63c07aa5d2361a8829f3895cf2bd
2020-04-04 09:15:31 +00:00
toc_priority: 43
toc_title: "\u0634\u0631\u0637\u06CC "
2020-03-30 12:48:55 +00:00
---
2020-04-04 09:15:31 +00:00
# توابع شرطی {#conditional-functions}
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
## اگر {#if}
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
کنترل انشعاب مشروط. بر خلاف اکثر سیستم های تاتر همیشه هر دو عبارت را ارزیابی کنید `then` و `else` .
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**نحو**
2020-03-30 12:48:55 +00:00
``` sql
SELECT if(cond, then, else)
```
2020-04-04 09:15:31 +00:00
اگر شرایط `cond` ارزیابی به یک مقدار غیر صفر, می گرداند در نتیجه بیان `then` و نتیجه بیان `else` , اگر در حال حاضر, قلم است. اگر `cond` صفر یا `NULL` سپس نتیجه `then` بیان نادیده گرفته شده است و در نتیجه `else` عبارت, در صورت حاضر, بازگشته است.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**پارامترها**
2020-03-30 12:48:55 +00:00
- `cond` – The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL.
2020-04-04 09:15:31 +00:00
- `then` - بیان به بازگشت اگر شرایط ملاقات کرده است.
- `else` - بیان به بازگشت اگر شرایط ملاقات نکرده است.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**مقادیر بازگشتی**
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
تابع اجرا می شود `then` و `else` عبارات و نتیجه خود را بر می گرداند, بسته به اینکه شرایط `cond` به پایان رسید تا صفر یا نه.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**مثال**
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
پرسوجو:
2020-03-30 12:48:55 +00:00
``` sql
SELECT if(1, plus(2, 2), plus(2, 6))
```
2020-04-04 09:15:31 +00:00
نتیجه:
2020-03-30 12:48:55 +00:00
``` text
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
```
2020-04-04 09:15:31 +00:00
پرسوجو:
2020-03-30 12:48:55 +00:00
``` sql
SELECT if(0, plus(2, 2), plus(2, 6))
```
2020-04-04 09:15:31 +00:00
نتیجه:
2020-03-30 12:48:55 +00:00
``` text
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
```
2020-04-04 09:15:31 +00:00
- `then` و `else` باید کمترین نوع مشترک دارند.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**مثال:**
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
اینو بگیر `LEFT_RIGHT` جدول:
2020-03-30 12:48:55 +00:00
``` sql
SELECT *
FROM LEFT_RIGHT
┌─left─┬─right─┐
│ ᴺᵁᴸᴸ │ 4 │
│ 1 │ 3 │
│ 2 │ 2 │
│ 3 │ 1 │
│ 4 │ ᴺᵁᴸᴸ │
└──────┴───────┘
```
2020-04-04 09:15:31 +00:00
پرس و جو زیر مقایسه می کند `left` و `right` مقادیر:
2020-03-30 12:48:55 +00:00
``` sql
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 │
└──────┴───────┴─────────────────────────────────────┘
```
2020-04-04 09:15:31 +00:00
یادداشت: `NULL` ارزش ه ا در این مثال استفاده نمی شود, بررسی [ارزشهای پوچ در شرطی ](#null-values-in-conditionals ) بخش.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
## اپراتور سه تایی {#ternary-operator}
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
این همان کار می کند `if` تابع.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
نحو: `cond ? then : else`
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
بازگشت `then` اگر `cond` ارزیابی درست باشد (بیشتر از صفر), در غیر این صورت بازده `else` .
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
- `cond` باید از نوع باشد `UInt8` و `then` و `else` باید کمترین نوع مشترک دارند.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
- `then` و `else` می تواند باشد `NULL`
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**همچنین نگاه کنید به**
2020-03-30 12:48:55 +00:00
2020-04-30 18:19:18 +00:00
- [اطلاعات دقیق ](other-functions.md#ifnotfinite ).
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
## چندف {#multiif}
2020-03-30 12:48:55 +00:00
2020-05-15 04:34:54 +00:00
اجازه می دهد تا شما را به نوشتن [CASE ](../operators/index.md#operator_case ) اپراتور فشرده تر در پرس و جو.
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
نحو: `multiIf(cond_1, then_1, cond_2, then_2, ..., else)`
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**پارامترها:**
2020-03-30 12:48:55 +00:00
- `cond_N` — The condition for the function to return `then_N` .
- `then_N` — The result of the function when executed.
- `else` — The result of the function if none of the conditions is met.
2020-04-04 09:15:31 +00:00
تابع می پذیرد `2N+1` پارامترها
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**مقادیر بازگشتی**
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
تابع یکی از مقادیر را برمی گرداند `then_N` یا `else` , بسته به شرایط `cond_N` .
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
**مثال**
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
دوباره با استفاده از `LEFT_RIGHT` جدول
2020-03-30 12:48:55 +00:00
``` sql
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 │
└──────┴───────┴─────────────────┘
```
2020-04-04 09:15:31 +00:00
## با استفاده از نتایج شرطی به طور مستقیم {#using-conditional-results-directly}
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
شرطی همیشه به نتیجه `0` , `1` یا `NULL` . بنابراین شما می توانید نتایج شرطی به طور مستقیم مثل این استفاده کنید:
2020-03-30 12:48:55 +00:00
``` sql
SELECT left < right AS is_small
FROM LEFT_RIGHT
┌─is_small─┐
│ ᴺᵁᴸᴸ │
│ 1 │
│ 0 │
│ 0 │
│ ᴺᵁᴸᴸ │
└──────────┘
```
2020-04-04 09:15:31 +00:00
## ارزشهای پوچ در شرطی {#null-values-in-conditionals}
2020-03-30 12:48:55 +00:00
2020-05-15 04:34:54 +00:00
چه زمانی `NULL` ارزش ه ا در شرطی درگیر, نتیجه نیز خواهد بود `NULL` .
2020-03-30 12:48:55 +00:00
``` sql
SELECT
NULL < 1 ,
2 < NULL ,
NULL < NULL ,
NULL = NULL
┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────────┴───────────────┴──────────────────┴────────────────────┘
```
2020-04-04 09:15:31 +00:00
بنابراین شما باید نمایش داده شد خود را با دقت ساخت اگر انواع هستند `Nullable` .
2020-03-30 12:48:55 +00:00
2020-04-04 09:15:31 +00:00
مثال زیر نشان می دهد این شکست برای اضافه کردن شرایط برابر به `multiIf` .
2020-03-30 12:48:55 +00:00
``` sql
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 │
└──────┴───────┴──────────────────┘
```
2020-04-04 09:15:31 +00:00
[مقاله اصلی ](https://clickhouse.tech/docs/en/query_language/functions/conditional_functions/ ) <!--hide-->