[新機能]カラム名が一致する場合にUNIONが行える「UNION BY NAME」がリリースされました

[新機能]カラム名が一致する場合にUNIONが行える「UNION BY NAME」がリリースされました

Clock Icon2025.06.23

さがらです。

Snowflakeの新機能として、カラム名が一致する場合にUNIONが行える「UNION BY NAME」がリリースされました。

https://docs.snowflake.com/en/release-notes/2025/9_15#union-by-name-operator

https://docs.snowflake.com/en/sql-reference/operators-query

この機能を早速試してみたので、内容をまとめてみます。

試してみた

適当にテーブルを作成し、UNION BY NAMEを用いたクエリを実行してみます。

まず、以下のクエリを実行してテーブルを作成します。

-- データベース・スキーマの準備
use role sysadmin;
use warehouse compute_wh;

create database test_db;
use database test_db;
create schema union_test;
use schema union_test;

-- サンプルテーブル1の作成とデータ挿入
-- このテーブルは製品の詳細情報を含みます
create or replace table product_details (
  product_id      integer,
  product_name    varchar(255),
  category        varchar(100),
  price           decimal(10, 2)
);

insert into product_details (product_id, product_name, category, price) values
  (101, 'Laptop Pro', 'Electronics', 1200.00),
  (102, 'Mechanical Keyboard', 'Electronics', 150.00),
  (201, 'Ergonomic Chair', 'Office Furniture', 300.00),
  (301, 'Wireless Mouse', 'Accessories', 50.00);

-- サンプルテーブル2の作成とデータ挿入
-- このテーブルは製品の在庫情報を含みます。
-- カラムの順序がproduct_detailsと異なり、カラム名も一部異なります。
create or replace table product_inventory_info (
  item_name       varchar(255), -- product_nameに対応
  item_id         integer,      -- product_idに対応
  stock_quantity  integer,
  warehouse_location varchar(100)
);

insert into product_inventory_info (item_name, item_id, stock_quantity, warehouse_location) values
  ('Mechanical Keyboard', 102, 50, 'Warehouse A'),
  ('Gaming Monitor', 103, 20, 'Warehouse B'), -- product_detailsにはない新しい製品
  ('Laptop Pro', 101, 30, 'Warehouse A'),
  ('Desk Lamp', 401, 100, 'Warehouse C'); -- product_detailsにはない新しい製品

この上で、以下のクエリを実行します。union all by nameとすることで、カラム名が一致する場合にUNIONすることが出来ます。as product_nameのようにエイリアスを設定することで、エイリアスに設定したカラム名で一致する場合にUNIONをしてくれます。

select
  product_name,             
  product_id,               
  price,                    
  category,                 
  null as warehouse_location,
  null as stock_quantity     
from product_details

union all by name

select
  stock_quantity,           
  item_name as product_name,  -- item_name を product_name として結合
  item_id as product_id,      -- item_id を product_id として結合
  warehouse_location,         
  null as category,           
  null as price               
from product_inventory_info
order by product_id, product_name;

2025-06-23_09h03_49

また、上のクエリでは合致するカラムがSELECTするテーブルにない場合にnullをいれていましたが、このnullを各SELECT文から消すとどうなるかも確認してみました。結果としては、1つ目のSELECT文、2つ目のSELECT文、どちらのnullを削除しても問題なく実行できました!(この仕様は公式Docにも言及あります)

  • 2つ目のSELECT文からnullを削除 ⇛ 問題なく実行
select
  product_name,             
  product_id,               
  price,                    
  category,                 
  null as warehouse_location,
  null as stock_quantity     
from product_details

union all by name

select
  stock_quantity,           
  item_name as product_name,  -- item_name を product_name として結合
  item_id as product_id,      -- item_id を product_id として結合
  warehouse_location        
from product_inventory_info
order by product_id, product_name;

2025-06-23_09h05_39

  • 1つ目のSELECT文からnullを削除 ⇛ 問題なく実行
select
  product_name,             
  product_id,               
  price,                    
  category,                    
from product_details

union all by name

select
  stock_quantity,           
  item_name as product_name,  -- item_name を product_name として結合
  item_id as product_id,      -- item_id を product_id として結合
  warehouse_location,       
  null as category,         
  null as price             
from product_inventory_info
order by product_id, product_name;

2025-06-23_09h07_45

最後に

Snowflakeの新機能として、カラム名が一致する場合にUNIONが行える「UNION BY NAME」を試してみました。

カラム名が一致する場合にUNIONができ、カラム名が存在しない場合は自動的にnullとして扱われるため、よりUNIONが扱いやすくなると感じました!ぜひご活用ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.