[新機能]カラム名が一致する場合にUNIONが行える「UNION BY NAME」がリリースされました
さがらです。
Snowflakeの新機能として、カラム名が一致する場合にUNIONが行える「UNION BY NAME」がリリースされました。
この機能を早速試してみたので、内容をまとめてみます。
試してみた
適当にテーブルを作成し、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;
また、上のクエリでは合致するカラムが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;
- 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;
最後に
Snowflakeの新機能として、カラム名が一致する場合にUNIONが行える「UNION BY NAME」を試してみました。
カラム名が一致する場合にUNIONができ、カラム名が存在しない場合は自動的にnullとして扱われるため、よりUNIONが扱いやすくなると感じました!ぜひご活用ください。