PG 9.4+では:
SELECT p.id, string_agg(c.name, ' > ' ORDER BY t.ord) AS label
FROM product p
JOIN regexp_split_to_table(p.category::text, '[.]') WITH ORDINALITY t(category, ord) ON true
JOIN categories c ON c.id = t.category::int
GROUP BY p.id;
この行:
regexp_split_to_table(p.category::text, '[.]') WITH ORDINALITY t(category, ord)
はltree
列を取り、それを の要素ごとに行に分割しますltree
。このWITH ORDINALITY
句は、ここでは alias を使用して行番号を出力に追加しますord
。その行番号はstring_agg()
、カテゴリ ラベルを正しい順序に保つために関数で使用されます。
古いバージョンの PG (9.0+)を使用している場合(アップグレードするか、そうでなければ)、次のことを行う必要があります。
SELECT p.id, string_agg(c.name, ' > ' ORDER BY t.ord) AS label
FROM product p
JOIN generate_series(1, nlevel(p.category)) t(ord) ON true
JOIN categories c ON c.id = subltree(p.category, t.ord - 1, t.ord)::text::int
GROUP BY p.id;
ltree
に含まれる個々の要素ごとに を解析する必要があるため、これは効率的ではありません( subltree(...)
)。