【SQL】ユーザー定義関数を作って、分析効率を爆上げしよう!

【SQL】ユーザー定義関数を作って、分析効率を爆上げしよう!

どうも、hosigakiです!

「SQLでオリジナルの関数を作れたらな〜...」と思ったことはありませんか?
実はこれ簡単に作れるんです!

今日は、「ユーザー定義関数」(以下、UDF)について解説します!

UDFの書き方

CREATE TEMPORARY FUNCTION 関数名(引数1 データ型, 引数2 データ型,...) AS (
    関数の定義
)
;

/*ここから下のクエリで、上記のUDFが使えるようになります。*/

書き方だけだと、いまいちイメージが掴みづらいので、以下の具体例も一緒に見てみましょう!

UDFの具体例

今日の日付を算出する関数

CREATE TEMPORARY FUNCTION today() AS (
    CURRENT_DATE("Asia/Tokyo")
)
;

SELECT
    today() /*今日の日付が算出される*/

引数がないUDFの例です。
引数がなくても、UDFを呼び出す際は括弧が必須なので注意しましょう。

奇数か偶数かを判定する関数

CREATE TEMPORARY FUNCTION judge(i INT64) AS (
    CASE
        WHEN MOD(i, 2) = 1 THEN "奇数"
        ELSE "偶数"
    END
)
;

SELECT
    judge(1), /* 抽出結果「奇数」 */
    judge(2), /* 抽出結果「偶数」 */
    judge(3), /* 抽出結果「奇数」 */
    judge(4), /* 抽出結果「偶数」 */
    judge(5)  /* 抽出結果「奇数」 */

引数が1つのUDFの例です。
例えば judge(1)は、「奇数」という結果が抽出されます。

(ちなみにUDFの定義で記載しているMOD(i, 2)とは、iを2で割った際の余りを算出する関数で、デフォルトで用意されている関数です。)

割引後の値段を算出する関数

CREATE TEMPORARY FUNCTION price_judge(youbi STRING, price INT64) AS (
    CASE
        WHEN youbi = "月" THEN price
        WHEN youbi = "火" THEN price * 0.9
        WHEN youbi = "水" THEN price * 0.8
        WHEN youbi = "木" THEN price * 0.7
        WHEN youbi = "金" THEN price * 0.6
        WHEN youbi = "土" THEN price * 0.5
        WHEN youbi = "日" THEN price * 0.4
    END
)
;

SELECT
    price_judge("月", 100), /* 抽出結果 100 */
    price_judge("火", 100), /* 抽出結果 90 */
    price_judge("水", 100), /* 抽出結果 80 */
    price_judge("木", 100), /* 抽出結果 70 */
    price_judge("金", 100), /* 抽出結果 60 */
    price_judge("土", 100), /* 抽出結果 50 */
    price_judge("日", 100)  /* 抽出結果 40 */


月曜日から日曜日にかけて、商品の割引率が10%ずつ上がっていく店があったとします(こんな店見たことないですが笑) 。

上記のクエリは、曜日と商品金額を引数で渡すことで、割引後の値段を算出する関数を定義しています。

【補足】一時的UDFと永続的UDFについて

UDFには、「一時UDF」と「永続的UDF」の2種類があります。2つの違いは、UDFの定義をデータセット(テーブルなどが格納されている場所)に保存するか否かです。

今回の記事では、「一時的UDF」について解説しています。こちらはUDFの定義を保存しないため、毎回クエリを書く際に、UDFの定義も一緒に書く必要があります。

一方「永続的UDF」の方は、一度定義するとデータセットにその定義が保存されるため、次回からはUDFの定義を書かなくても、クエリ内でUDFを使うこと可能になります。ただし、データセットに定義を保存することになるので、もし作成する際は、事前にデータベースの管理者に、作成の旨を相談するのがベターかと思います。

今回は、一時的UDFの書き方について紹介しました!
使いこなすと、クエリの可読性を上げたり、ミスの発生率を抑えることができるので、ぜひぜひご活用してみてくださいね!

最後まで読んでいただきありがとうございました!
また次の記事でお会いしましょう(^o^)/

-SQL
-, , , ,