こんなテーブルがあるとする(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 よりも見やすいからこっちのが自分はすきです。