Il existe un troisième type de fonction auquel appartient la fonction ‘arrayJoin’. Les fonctions de table peuvent également être mentionnées séparément.
Typage fort
Élimination des sous-expressions communes
Types de résultats
Constantes
Traitement des NULL
- Si au moins un des arguments de la fonction est
NULL, le résultat de la fonction est lui aussiNULL. - Comportement particulier précisé individuellement dans la description de chaque fonction. Dans le code source de ClickHouse, ces fonctions ont
UseDefaultImplementationForNulls=false.
Constance
Fonctions d’ordre supérieur
Opérateur -> et fonctions lambda(params, expr)
->. À gauche de la flèche figure un paramètre formel, qui peut être n’importe quel identifiant, ou plusieurs paramètres formels — n’importe quels identifiants dans un tuple. À droite de la flèche figure une expression qui peut utiliser ces paramètres formels ainsi que n’importe quelles colonnes de la table.
Exemples :
Noms de fonctions utilisés directement comme lambdas
arrayMap(plus, ...) utilise une arité de 2, car plus prend deux arguments ; cela fonctionne donc aussi avec des entrées de tuple telles que arrayMap(plus, [(1, 10), (2, 20)]), où les éléments du tuple sont dépaquetés dans les arguments de la lambda.
Pour les fonctions internes variadiques (comme concat, qui accepte un nombre quelconque d’arguments), l’arité de la lambda retombe sur le nombre d’arguments de tableau. C’est correct pour les fonctions d’ordre supérieur comme arrayMap, arrayFilter et arrayFold. Pour les fonctions d’ordre supérieur qui acceptent des paramètres fixes non-tableau en plus des tableaux — par exemple, arrayPartialSort(f, limit, arr) — les noms de fonctions variadiques utilisés seuls peuvent produire une arité incorrecte ; dans ce cas, une lambda explicite est requise.
Les fonctions internes variadiques ne dépaquettent pas non plus automatiquement les entrées de tuple. Par exemple, arrayMap(concat, [('a', 'b'), ('c', 'd')]) se réécrit en une lambda unaire et n’est pas équivalent à arrayMap((x, y) -> concat(x, y), [('a', 'b'), ('c', 'd')]). Utilisez une lambda explicite lorsque vous souhaitez déstructurer les éléments du tuple dans un appel variadique.