どうも、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^)/