Snowflakeで関数作れるらしいです。
UDF(user-defined function:ユーザー定義関数)というやつですね。
OracleのFunctionとだいたい一緒かな?となんとなく思っているものの、
触ったことがないので一度作ってみようとやってみました。
お試しでどんな関数を作りましょうか?
西暦から和暦変換をする関数でも作りましょう。
言語はPythonです。
私の頭では考えられないのでClaude 3.5 Sonnetに書いてもらいました。
私:Pythonで西暦から和暦に変換するコードを書いてください
Claude先生:以下に、西暦から和暦に変換するPythonコードを示します。このコードは、明治、大正、昭和、平成、令和の5つの元号に対応しています。
def seireki_to_wareki(year):
if year < 1868:
return f"{year}年は明治以前です"
elif 1868 <= year < 1912:
era = "明治"
era_year = year - 1867
elif 1912 <= year < 1926:
era = "大正"
era_year = year - 1911
elif 1926 <= year < 1989:
era = "昭和"
era_year = year - 1925
elif 1989 <= year < 2019:
era = "平成"
era_year = year - 1988
else:
era = "令和"
era_year = year - 2018
return f"{era}{era_year}年"
# 使用例
print(seireki_to_wareki(2024)) # 令和6年
print(seireki_to_wareki(1989)) # 平成1年
print(seireki_to_wareki(1926)) # 昭和1年
print(seireki_to_wareki(1912)) # 大正1年
print(seireki_to_wareki(1868)) # 明治1年
print(seireki_to_wareki(1867)) # 1867年は明治以前です
2秒くらいで返ってきました。
天才ですね。
ではこれをSnowflakeのUDFにして見ましょう。
CREATE OR REPLACE FUNCTION seireki_to_wareki(year int)
RETURNS VARCHAR
LANGUAGE PYTHON
RUNTIME_VERSION = '3.8'
HANDLER = 'seireki_to_wareki_py'
as
$$
def seireki_to_wareki_py(year):
if year < 1868:
return f"{year}年は明治以前です"
elif 1868 <= year < 1912:
era = "明治"
era_year = year - 1867
elif 1912 <= year < 1926:
era = "大正"
era_year = year - 1911
elif 1926 <= year < 1989:
era = "昭和"
era_year = year - 1925
elif 1989 <= year < 2019:
era = "平成"
era_year = year - 1988
else:
era = "令和"
era_year = year - 2018
return f"{era}{era_year}年"
$$;
Snowflake上に関数ができたので使ってみます。
select seireki_to_wareki(1989);
SEIREKI_TO_WAREKI(1989) |
---|
平成1年 |
こういう汎用的なのではなくて、自社データを使った関数なんかを作っていけばいろんな処理からこの関数呼ぶといいよって言えますね。