はじめに:UDFって何ができるの?
SnowflakeでSQLを書いていると、「同じ計算ロジックを何度も書くのが面倒だな…」と感じる瞬間ってありますよね。例えば「税込価格を計算する」「メールアドレスからドメイン部分だけ取り出す」といった処理を、毎回 CASE や文字列関数を組み合わせて書くのは大変です。
そんなときに便利なのが ユーザー定義関数(UDF:User-Defined Function)。自分だけの関数を作って、SELECT my_func(col) のように呼び出せるようになります。Snowflakeでは SQL・JavaScript・Python・Java・Scala の5言語でUDFを書けますが、今回はもっとも使われる SQL UDF / JavaScript UDF / Python UDF の3つを初心者向けに解説します!

UDFとストアドプロシージャの違い
よく似た仕組みに「ストアドプロシージャ」がありますが、両者は役割が異なります。
- UDF:値を受け取って 値を返す。
SELECT文の中で使える。 - ストアドプロシージャ:複数のSQLを順に実行する 処理の塊。
CALL文で呼び出す。
「計算式」がUDF、「業務フロー」がストアドプロシージャ、というイメージです。プロシージャ側の解説はSnowflakeストアドプロシージャ入門|SQLとJavaScript版の使い方にまとめているので、合わせて読むと違いがクリアになりますよ。
① SQL UDF:いちばんシンプルで高速
まずは基本のSQL UDF。SQL式をそのまま関数として登録するだけなので、初心者でもすぐ書けます。
-- 税込価格を返すSQL UDF
CREATE OR REPLACE FUNCTION calc_tax_included(price NUMBER)
RETURNS NUMBER
AS
$$
price * 1.1
$$;
-- 呼び出し
SELECT calc_tax_included(1000); -- → 1100
$$ ... $$ の中にSQL式を書くだけ。サブクエリも書けるので、テーブルを参照する関数も作れます。SQL UDFはSnowflakeが内部で最適化してくれるため、パフォーマンスが最も優秀なのが特徴です。
② JavaScript UDF:複雑な分岐や文字列処理に
SQLだけでは書きにくい「複雑なループ処理」「正規表現+条件分岐」などはJavaScript UDFの出番です。
CREATE OR REPLACE FUNCTION extract_domain(email STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
if (!EMAIL) return null;
var parts = EMAIL.split('@');
return parts.length === 2 ? parts[1] : null;
$$;
SELECT extract_domain('hello@example.com'); -- → example.com
ポイントは 引数名を大文字で参照すること(JavaScript側では自動で大文字に変換されます)。SQL UDFより少し遅いですが、手続き的な処理を直感的に書けるのが魅力です。

③ Python UDF:データ分析・ML系処理の強い味方
Python UDFは、Snowparkの登場でぐっと身近になりました。Anaconda経由でNumPyやPandas等のライブラリも使えるので、機械学習の前処理や複雑な文字列処理に最適です。
CREATE OR REPLACE FUNCTION zen_sum(a INT, b INT)
RETURNS INT
LANGUAGE PYTHON
RUNTIME_VERSION = '3.10'
HANDLER = 'add'
AS
$$
def add(a, b):
return a + b
$$;
SELECT zen_sum(10, 32); -- → 42
HANDLER で実行する関数名を指定するのが特徴です。外部ライブラリを使う場合は PACKAGES = ('numpy') のように指定すればOK。
Snowsightでの作成・確認方法
Snowsightの左メニュー「Data → Databases」から対象スキーマを開くと、FunctionsタブにUDFの一覧が表示されます。シグネチャ・戻り値・定義コードもここで確認できるので、チームで共有するときに便利です。
注意点とベストプラクティス
- 速度重視ならSQL UDF:書ける処理なら最優先で選ぶ。
- JavaScript/Pythonは少し遅い:大量行に対して使うとコストが増えがち。
- セキュア化も可能:
SECUREオプションで定義コードを隠せます。 - テーブル関数(UDTF)もあり、複数行を返したい場合に使えます。
まとめ
SnowflakeのUDFは、繰り返し書くロジックを関数化して、SQLをぐっと読みやすく・再利用しやすくしてくれる強力な機能です。「まずSQL UDFで書けるか試して、無理ならJavaScript、データ分析的な処理ならPython」という流れで選ぶと迷いません。ぜひ自分だけの便利関数を作って、SQLライフを快適にしていきましょう!
参考リンク
関連記事
- Snowflakeストアドプロシージャ入門|SQLとJavaScript版の使い方 – UDFと対になる「処理の塊」を作る機能。違いをセットで理解しよう。
- SnowflakeのSELECT文入門|他DBとの違いを初心者向けに解説 – 自作UDFを呼び出すSELECT文の基礎をおさらい。
- Snowflake VARIANT型のドット記法とFLATTENで半構造化データを自在に扱う – JSONを扱うUDFを書くときに必須の知識。
- Snowflake QUALIFY句の使い方|ウィンドウ関数の絞り込みが超簡単に – UDFと組み合わせると分析SQLがさらに快適に。
- Snowsightの画面構成と基本操作を初心者向けにやさしく解説 – 作ったUDFを画面で確認する方法はこちら。

