Snowflake UDF入門|SQL・JavaScript・Pythonで関数を自作する方法

Snowflake UDF入門|SQL・JavaScript・Pythonで関数を自作する方法 Snowflake

はじめに: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つを初心者向けに解説します!

Snowflake UDFの概要と税込計算やドメイン抽出など繰り返し処理を関数化するメリットを示すイメージ図

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より少し遅いですが、手続き的な処理を直感的に書けるのが魅力です。

Snowflake UDFをJavaScriptで実装しメールアドレスからドメインを抽出する関数のコード例

③ 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ライフを快適にしていきましょう!

参考リンク

関連記事