コンテンツにスキップ
Dev Classmethod Jp Snowflake Virtual Columns

Snowflake Virtual Columns(仮想列)をGAで試してみた

  • URL: https://dev.classmethod.jp/articles/snowflake-try-virtual-columns/
  • 日付: 2026-06-06
  • Tier: Tier 3
  • 要旨: SnowflakeにVirtual Columns(仮想列)がGA。テーブルに値を格納せずクエリ実行時に式から計算する列を定義できる機能で、これまでViewで実現していた派生列をテーブル本体に定義できるようになった。算術演算・文字列関数・CASE式・仮想列チェーンなど複数パターンを実測で確認。

詳細

基本構文

CREATE TABLE t (col TYPE AS (expr));
ALTER TABLE t ADD COLUMN col TYPE AS (expr);

値はテーブルに保存されず、クエリのたびに計算される。

試したパターン

  1. 算術演算(quantity * unit_priceで合計金額)
  2. 仮想列チェーン(total_price * 0.1で消費税額 → 先行仮想列の参照)
  3. 文字列関数(SUBSTR/POSITIONでメールドメイン抽出)
  4. CASE式(金額帯分類)
  5. DESC TABLEKIND = VIRTUALEXPRESSION列で定義式を確認
  6. CTAS(CREATE TABLE AS SELECT)での仮想列引き継ぎ

主な制限(2026-06-06時点)

  • 非決定的関数(RANDOM、CURRENT_TIMESTAMP等)、集計・ウィンドウ関数、UDF、サブクエリは使用不可
  • NOT NULLCHECK制約不可、クラスタリングキー設定不可
  • ベース列のDROP COLUMN不可(仮想列が参照している場合)
  • 仮想列からの前方参照不可(先に定義された仮想列のみ参照可)

既知の問題(Known Issue)

  • COALESCEなど NULL→非NULL変換式を持つ仮想列を外部結合で使用すると、結合不一致行で非NULLが返る場合あり
  • ワークアラウンド:SELECT句側でCOALESCEを適用する

実用的な意義

  • テーブルとViewのペアをテーブル1つで代替可能
  • DESC TABLEKIND列で仮想列と通常列を識別できるため、スキーマ管理が明確