6.3 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | f865c9653f |
43 | Conditionnel |
Fonctions conditionnelles
si
Contrôle la ramification conditionnelle. Contrairement à la plupart des systèmes, ClickHouse évalue toujours les deux expressions then
et else
.
Syntaxe
SELECT if(cond, then, else)
Si la condition cond
renvoie une valeur non nulle, retourne le résultat de l'expression then
et le résultat de l'expression else
, si présent, est ignoré. Si l' cond
est égal à zéro ou NULL
alors le résultat de la then
l'expression est ignorée et le résultat de else
expression, si elle est présente, est renvoyée.
Paramètre
cond
– The condition for evaluation that can be zero or not. The type is UInt8, Nullable(UInt8) or NULL.then
- L'expression à renvoyer si la condition est remplie.else
- L'expression à renvoyer si la condition n'est pas remplie.
Valeurs renvoyées
La fonction s'exécute then
et else
expressions et retourne son résultat, selon que la condition cond
fini par être zéro ou pas.
Exemple
Requête:
SELECT if(1, plus(2, 2), plus(2, 6))
Résultat:
┌─plus(2, 2)─┐
│ 4 │
└────────────┘
Requête:
SELECT if(0, plus(2, 2), plus(2, 6))
Résultat:
┌─plus(2, 6)─┐
│ 8 │
└────────────┘
then
etelse
doit avoir le type commun le plus bas.
Exemple:
Prendre cette LEFT_RIGHT
table:
SELECT *
FROM LEFT_RIGHT
┌─left─┬─right─┐
│ ᴺᵁᴸᴸ │ 4 │
│ 1 │ 3 │
│ 2 │ 2 │
│ 3 │ 1 │
│ 4 │ ᴺᵁᴸᴸ │
└──────┴───────┘
La requête suivante compare left
et right
valeur:
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 │
└──────┴───────┴─────────────────────────────────────┘
Note: NULL
les valeurs ne sont pas utilisés dans cet exemple, vérifier Valeurs nulles dans les conditions section.
Opérateur Ternaire
Il fonctionne même comme if
fonction.
Syntaxe: cond ? then : else
Retourner then
si l' cond
renvoie la valeur vrai (supérieur à zéro), sinon renvoie else
.
-
cond
doit être de type deUInt8
, etthen
etelse
doit avoir le type commun le plus bas. -
then
etelse
peut êtreNULL
Voir aussi
multiIf
Permet d'écrire le CASE opérateur plus compacte dans la requête.
Syntaxe: multiIf(cond_1, then_1, cond_2, then_2, ..., else)
Paramètre:
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.
La fonction accepte 2N+1
paramètre.
Valeurs renvoyées
La fonction renvoie l'une des valeurs then_N
ou else
selon les conditions cond_N
.
Exemple
En utilisant à nouveau LEFT_RIGHT
table.
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 │
└──────┴───────┴─────────────────┘
Utilisation directe des résultats conditionnels
Les conditions entraînent toujours 0
, 1
ou NULL
. Vous pouvez donc utiliser des résultats conditionnels directement comme ceci:
SELECT left < right AS is_small
FROM LEFT_RIGHT
┌─is_small─┐
│ ᴺᵁᴸᴸ │
│ 1 │
│ 0 │
│ 0 │
│ ᴺᵁᴸᴸ │
└──────────┘
Valeurs nulles dans les conditions
Lorsque NULL
les valeurs sont impliqués dans des conditions, le résultat sera également NULL
.
SELECT
NULL < 1,
2 < NULL,
NULL < NULL,
NULL = NULL
┌─less(NULL, 1)─┬─less(2, NULL)─┬─less(NULL, NULL)─┬─equals(NULL, NULL)─┐
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
└───────────────┴───────────────┴──────────────────┴────────────────────┘
Donc, vous devriez construire vos requêtes avec soin si les types sont Nullable
.
L'exemple suivant le démontre en omettant d'ajouter la condition égale à 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 │
└──────┴───────┴──────────────────┘