# WITH句を使ってファンクションを作成

WITH句は、パラメーター付きのカスタムファンクションを作成する場合に使用できます。

この機能は、Talend Studio R2025-03以降のバージョンをインストール済みである場合にTalend Data Mapperで利用可能です。

パラメーター化済みのWITH句は、次のように構造化する必要があります:

```
WITH functionName(argument_1, argument_2, ...) = expression/block/sub-query
```

たとえば、2つの値の間に数字あるかどうかをチェックする式が含まれているファンクションを作成し、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
 }
```

次の例では、文字列からファーストネームとラストネームを抽出するブロックが含まれているファンクションが作成されます:

```
WITH extractNames(fullname) = {
   LET names = split(fullname, ' '),
   firstname = names[0],
   lastname = names[1]
}
FROM customer AS c
SELECT extractNames(c.fullname)
```

次の例では、サブクエリーを使ってアイテムのリストを反復処理します:

```
WITH collectItemsIds(items) = (
   FROM items AS i
   SELECT i.itemno
)
FROM orders AS o
SELECT {
   id = o.orderno,
   itemIds = collectItemsIds(o.items)
}
```

パラメーター化済みのWITH句では、再帰がサポートされています。WITH句を使って作成されたファンクションは、そのファンクション自体において呼び出すことができます。例:

```
WITH factorial(n) = IF (n > 1) n * factorial(n-1) ELSE 1
SELECT factorial(10) 
```

情報メモ重要: カスタムファンクションの名前では、大文字と小文字が区別されません。たとえば、次のスクリプトは許可されません:

```
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) }
```

情報メモ制約事項:

* パラメーター化済みのWITH句は、メインスクリプトの最初でしか定義できません。
* パラメーター化済みのWITH句は、集計ファンクションを使用できません。
* 再帰的なパラメーター化済みのWITH句では、INDEX句を使用できません。