はじめに
どうも、そらです。
Azure SQLでSQLを書いていた私が、初めてSnowflakeの案件に入ったときに戸惑った書き方をまとめます。
SQLの基本的な考え方は同じですが、関数名やデータの絞り込み方に違いがあります。
この記事では、特に使用頻度が高かった以下の4点を紹介します。
DATEADDQUALIFYTRY_TO_DATE- カラム名の囲み方
1. DATEADDはSnowflake限定ではない
最初にSnowflakeのSQLでDATEADDを見たときは、Snowflake独自の関数だと思っていました。
しかし、DATEADDはAzure SQLにもあります。
Azure SQL
SELECT DATEADD(DAY, -7, GETDATE());
Snowflake
SELECT DATEADD(DAY, -7, CURRENT_DATE());
どちらも、基本的には次の順番で指定します。
DATEADD(加算する単位, 加算する値, 基準日)
違いとして意識したのは、現在日時の取得方法です。
| 用途 | Azure SQL | Snowflake |
|---|---|---|
| 現在日時 | GETDATE() |
CURRENT_TIMESTAMP() |
| 現在日 | CAST(GETDATE() AS DATE) |
CURRENT_DATE() |
DATEADD自体よりも、周辺の日時関数との組み合わせに慣れる必要がありました。
2. QUALIFYでROW_NUMBERの結果を直接絞り込める
個人的に一番便利だと感じたのがQUALIFYです。
たとえば、顧客ごとに最新のレコードを1件だけ取得する場合、Azure SQLでは共通テーブル式や副問い合わせを使います。
Azure SQL
WITH ranked_data AS (
SELECT
顧客ID,
更新日時,
売上金額,
ROW_NUMBER() OVER (
PARTITION BY 顧客ID
ORDER BY 更新日時 DESC
) AS rn
FROM 売上テーブル
)
SELECT
顧客ID,
更新日時,
売上金額
FROM ranked_data
WHERE rn = 1;
Snowflakeでは、QUALIFYを使って短く書けます。
Snowflake
SELECT
"顧客ID",
"更新日時",
"売上金額"
FROM "売上テーブル"
QUALIFY ROW_NUMBER() OVER (
PARTITION BY "顧客ID"
ORDER BY "更新日時" DESC
) = 1;
WHEREが通常のカラムを絞り込むのに対し、QUALIFYはROW_NUMBERなどのウィンドウ関数の結果を絞り込むために使います。
重複排除や最新レコードの取得で、特に使用頻度が高い構文でした。
3. TRY_TO_DATEは日付変換のエラーを避けられる
文字列を日付型へ変換するとき、形式外のデータが含まれているとエラーになることがあります。
Snowflakeでは、TRY_TO_DATEを使うと、変換できない値をNULLにできます。
SELECT
TRY_TO_DATE("日付文字列", 'YYYY/MM/DD') AS "変換後の日付"
FROM "テーブル名";
たとえば、以下のデータが入っているとします。
| 日付文字列 |
|---|
| 2026/07/01 |
| 2026/07/15 |
| 日付不明 |
日付不明は日付に変換できないため、TRY_TO_DATEの結果はNULLになります。
形式外のデータだけを確認する場合は、次のように書けます。
SELECT *
FROM "テーブル名"
WHERE "日付文字列" IS NOT NULL
AND TRY_TO_DATE("日付文字列", 'YYYY/MM/DD') IS NULL;
Azure SQLでは、TRY_CONVERTが近い役割を持ちます。
SELECT
TRY_CONVERT(DATE, 日付文字列, 111) AS 変換後の日付
FROM テーブル名;
Snowflakeでは、変換したい型が関数名に入っているため、初めは戸惑いましたが、慣れると読みやすいと感じました。
4. カラム名はダブルクォーテーションで囲む
Azure SQLでは、カラム名やテーブル名を角括弧で囲む書き方をよく使います。
SELECT
[売上日],
[売上金額]
FROM [売上テーブル];
Snowflakeでは、ダブルクォーテーションで囲みます。
SELECT
"売上日",
"売上金額"
FROM "売上テーブル";
Snowflakeでは、ダブルクォーテーションで囲んだ名前は大文字・小文字も区別されます。
そのため、実際に作成されているカラム名と同じ表記で書く必要があります。
-- 別のカラム名として扱われる可能性がある
SELECT "売上金額";
SELECT "売上金額";
日本語のカラム名を扱う案件では、基本的にダブルクォーテーションを付ける習慣をつけました。
まとめ
Azure SQLからSnowflakeへ移ったときに、特に戸惑った違いは以下です。
| 内容 | Azure SQL | Snowflake |
|---|---|---|
| 日付の加減算 | DATEADD |
DATEADD |
| 現在日 | CAST(GETDATE() AS DATE) |
CURRENT_DATE() |
| ウィンドウ関数の絞り込み | 共通テーブル式や副問い合わせ | QUALIFY |
| エラーを避けた日付変換 | TRY_CONVERT |
TRY_TO_DATE |
| カラム名の囲み方 | [カラム名] |
"カラム名" |
SQLの基本的な考え方は大きく変わりません。
最初はSnowflake独自の書き方に戸惑いましたが、QUALIFYやTRY_TO_DATEのように、データ加工やテストSQLを簡潔に書ける機能も多くあります。
特にAzure SQL経験者は、すべてを新しく覚え直すのではなく、「Azure SQLではどの書き方に相当するか」を比較すると理解しやすいと思います。