6.2 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | e8cd92bba3 |
43 | Koşullu |
Koşullu fonksiyonlar
eğer
Koşullu dallanmayı kontrol eder. Çoğu sistemin aksine, ClickHouse her zaman her iki ifadeyi de değerlendirir then
ve else
.
Sözdizimi
SELECT if(cond, then, else)
Eğer durum cond
sıfır olmayan bir değere değerlendirir, ifadenin sonucunu döndürür then
ve ifad andenin sonucu else
varsa, atlanır. Eğer... cond
sıfır veya NULL
fakat daha sonra sonucu then
ifade atlanır ve sonucu else
Ifade, varsa, döndürülür.
Parametre
cond
– The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL.then
- Koşul karşılanırsa dönmek için ifade.else
- Koşul karşılanmazsa dönmek için ifade.
Döndürülen değerler
İşlev yürütür then
ve else
ifadeler ve koşulun olup olmadığına bağlı olarak sonucunu döndürür cond
sıfır ya da değil.
Örnek
Sorgu:
SELECT if(1, plus(2, 2), plus(2, 6))
Sonuç:
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
Sorgu:
SELECT if(0, plus(2, 2), plus(2, 6))
Sonuç:
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
then
veelse
en düşük ortak türe sahip olmalıdır.
Örnek:
Bunu al LEFT_RIGHT
Tablo:
SELECT *
FROM LEFT_RIGHT
┌─left─┬─right─┐
│ ᴺᵁᴸᴸ │ 4 │
│ 1 │ 3 │
│ 2 │ 2 │
│ 3 │ 1 │
│ 4 │ ᴺᵁᴸᴸ │
└──────┴───────┘
Aşağıdaki sorgu karşılaştırır left
ve right
değerler:
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 │
└──────┴───────┴─────────────────────────────────────┘
Not: NULL
bu örnekte değerler kullanılmaz, kontrol edin Koşullardaki boş değerler bölme.
Üçlü Operatör
Aynı gibi çalışıyor. if
işlev.
Sözdizimi: cond ? then : else
Dönüşler then
eğer... cond
true (sıfırdan büyük) olarak değerlendirir, aksi takdirde döndürür else
.
-
cond
türü olmalıdırUInt8
, vethen
veelse
en düşük ortak türe sahip olmalıdır. -
then
veelse
olabilirNULL
Ayrıca bakınız
multiİf
Yaz allowsmanızı sağlar CASE operatör sorguda daha kompakt.
Sözdizimi: multiIf(cond_1, then_1, cond_2, then_2, ..., else)
Parametre:
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.
İşlev kabul eder 2N+1
parametre.
Döndürülen değerler
İşlev, değerlerden birini döndürür then_N
veya else
bu koşullara bağlı olarak cond_N
.
Örnek
Yine kullanarak LEFT_RIGHT
Tablo.
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 │
└──────┴───────┴─────────────────┘
Koşullu sonuçları doğrudan kullanma
Koşullar her zaman sonuç 0
, 1
veya NULL
. Böylece koşullu sonuçları doğrudan bu şekilde kullanabilirsiniz:
SELECT left < right AS is_small
FROM LEFT_RIGHT
┌─is_small─┐
│ ᴺᵁᴸᴸ │
│ 1 │
│ 0 │
│ 0 │
│ ᴺᵁᴸᴸ │
└──────────┘
Koşullardaki boş değerler
Ne zaman NULL
değerler koşullarla ilgilidir, sonuç da olacaktır NULL
.
SELECT
NULL < 1,
2 < NULL,
NULL < NULL,
NULL = NULL
┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────────┴───────────────┴──────────────────┴────────────────────┘
Bu nedenle, sorgularınızı türleri dikkatli bir şekilde oluşturmalısınız Nullable
.
Aşağıdaki örnek, eşittir koşulu eklemek başarısız tarafından bu gösterir 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 │
└──────┴───────┴──────────────────┘