1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure経験者がSnowflakeで最初に戸惑ったSQLの違い4選

1
Posted at

はじめに

どうも、そらです。
Azure SQLでSQLを書いていた私が、初めてSnowflakeの案件に入ったときに戸惑った書き方をまとめます。

SQLの基本的な考え方は同じですが、関数名やデータの絞り込み方に違いがあります。

この記事では、特に使用頻度が高かった以下の4点を紹介します。

  • DATEADD
  • QUALIFY
  • TRY_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が通常のカラムを絞り込むのに対し、QUALIFYROW_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独自の書き方に戸惑いましたが、QUALIFYTRY_TO_DATEのように、データ加工やテストSQLを簡潔に書ける機能も多くあります。

特にAzure SQL経験者は、すべてを新しく覚え直すのではなく、「Azure SQLではどの書き方に相当するか」を比較すると理解しやすいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?