こんなテーブルがあるとする(mst_dog)
id | dog_1 | dog_2 | dog_3 | dog_4 | coloer_1 | coloer_2 | coloer_3 | coloer_4 |
---|---|---|---|---|---|---|---|---|
1 | 柴犬 | コーギー | チワワ | ダックス | 黒 | ノーマル | 茶色 | 黒白 |
2 | シェルティー | コリー | 狆 | 秋田犬 | ノーマル | 黒白 | 黒白 | 茶色 |
3 | チャウチャウ | ボルゾイ | ゴールデン | ダックス | 紺 | プラチナブロンド | 金 | 茶色 |
こんなカラムをこんな風に取得したいとき。
dog | coloer |
---|---|
柴犬 | 黒 |
コーギー | ノーマル |
チワワ | 茶色 |
ダックス | coloer_4 |
ETC... |
UNIONを使ってもよいんだけれども。。。
get_dog.sql
WITH DOGLIST AS (
SELECT dog_1 as dog , coloer_1 as coloer FROM mst_dog
UNION ALL
SELECT dog_2 as dog , coloer_2 as coloer FROM mst_dog
UNION ALL
SELECT dog_3 as dog , coloer_3 as coloer FROM mst_dog
UNION ALL
SELECT dog_4 as dog , coloer_4 as coloer FROM mst_dog
)
SELECT * FROM DOGLIST
dog_の数が多いまたはカラム拡張された場合にしんどいので
こんな書き方もできるよ。
get_dog.sql
WITH DOGLIST AS (
SELECT
unnest (
ARRAY [
dog_1
,dog_2
,dog_3
,dog_4
]
) AS dog
, unnest (
ARRAY [
coloer_1
,coloer_2
,coloer_3
,coloer_4
]
) AS coloer
FROM
mst_dog
)
SELECT * FROM DOGLIST
CROS JOIN よりも見やすいからこっちのが自分はすきです。