Créer une fonction avec une clause WITH
La clause WITH peut être utilisée pour créer une fonction personnalisée avec des paramètres.
Cette fonctionnalité est disponible dans Talend Data Mapper lorsque vous avez installé le Studio Talend en version R2025-03 ou supérieure.
La clause WITH paramétrée doit être structurée comme suit :
WITH functionName(argument_1, argument_2, ...) = expression/block/sub-query
Par exemple, vous pouvez créer une fonction contenant une expression vérifiant si un nombre est compris entre deux valeurs, et utiliser cette fonction dans une clause WHERE :
WITH isBetween(val, min, max, exclusive) =
IF (exclusive)
hasValue(val) && val > min && val < max
ELSE
hasValue(val) && val >= min && val <= max
FROM customer
WHERE isBetween(rating, 500, 700, false)
SELECT {
name,
rating
}
L'exemple suivant crée une fonction contenant un bloc extrayant un prénom et un nom de famille d'une chaîne de caractères :
WITH extractNames(fullname) = {
LET names = split(fullname, ' '),
firstname = names[0],
lastname = names[1]
}
FROM customer AS c
SELECT extractNames(c.fullname)
L'exemple suivant utilise une sous-requête pour effectuer une boucle sur une liste d'éléments :
WITH collectItemsIds(items) = (
FROM items AS i
SELECT i.itemno
)
FROM orders AS o
SELECT {
id = o.orderno,
itemIds = collectItemsIds(o.items)
}
La clause WITH paramétrée supporte la récursivité. Vous pouvez appeler une fonction créée avec une clause WITH dans la fonction même. Par exemple :
WITH factorial(n) = IF (n > 1) n * factorial(n-1) ELSE 1
SELECT factorial(10)
Note InformationsImportant : Le nom de cette fonction personnalisée n'est pas sensible à la casse. Par exemple, le script suivant n'est pas accepté :
WITH maxi(a,b) = max(a,b)
WITH Maxi(a,b,c) = max(a,b,c)
FROM customer
SELECT { max1 = maxi(x,y), max2 = Maxi(x,y,z) }
Note InformationsRestriction :
- Une clause WITH paramétrée ne peut être définie qu'au début du script principal.
- Une clause WITH paramétrée ne peut pas utiliser de fonction d'agrégation.
- La clause INDEX ne peut être utilisée dans une clause WITH paramétrée récursive.