3

製品カテゴリを保存するために一般的な Postgres ltree を使用する推奨される方法は何ですか?

たとえば、この列には、 、、およびがユーザーに表示できるカテゴリ ラベルのテーブルへの外部キー"1.2.3"であるなどの ltree パスを含めることができます。123

categories

id | name
---+-----------
 1 | Hardware
---+-----------
 2 | Computers
---+-----------
 3 | Video Cards
---+-----------

ここで、特定の製品について、そのカテゴリを選択し、 のように具体化したいと思い"Hardware > Computers > Video Cards"ます。

4

1 に答える 1

8

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(...))。

于 2015-08-07T08:22:31.127 に答える