ということなので代替の方法を使用する必要がある。
下記の記事を参考にした。
公式ドキュメントも参考にした。
列持ちデータを行持ちにする
過去に書いてた下記の記事のテーブルを使用する。
テーブルの構成は下記のような感じ。
create database testdb;
create table recommend_item (item_id int PRIMARY KEY, recommend_item_1 int, recommend_item_2 int, recommend_item_3 int, recommend_item_4 int);
まずPostgreSQLのgenerate_series()
を使用するやり方。下記のように連番のテーブルを作成することで列持ちデータを行データに変換できる。
SELECT
*
FROM
(
SELECT
item_id,
CASE p.id
WHEN 1 THEN r.recommend_item_1
WHEN 2 THEN r.recommend_item_2
WHEN 3 THEN r.recommend_item_3
WHEN 4 THEN r.recommend_item_4
END AS r_item_id
FROM recommend_item AS r
CROSS JOIN (
SELECT generate_series(1, 4) AS id
) p
) sub
item_id | r_item_id
---------+-----------
1 | 8
1 | 3085
1 | 3241
1 | 3535
2 | 1186
2 | 2547
2 | 6764
2 | 6959
3 | 716
3 | 3546
3 | 5804
3 | 8174
4 | 2563
4 | 6874
4 | 7527
4 | 8290
5 | 2124
5 | 2690
5 | 3318
5 | 7319
代替の関数としてROW_NUMBER()を使用する。
SELECT
*
FROM
(
SELECT
item_id,
CASE p.id
WHEN 1 THEN r.recommend_item_1
WHEN 2 THEN r.recommend_item_2
WHEN 3 THEN r.recommend_item_3
WHEN 4 THEN r.recommend_item_4
END AS r_item_id
FROM recommend_item AS r
CROSS JOIN (
SELECT
ROW_NUMBER() OVER (ORDER BY true) AS id
FROM recommend_item
LIMIT 4
) p
) sub
ということで変換ができた。