次のようなカテゴリの階層があるとします。
id | name | parent_id
---+------------+-----------
1 | Computers |
---+------------+-----------
2 | Laptops | 1
---+------------+-----------
3 | Desktops | 1
---+------------+-----------
4 | Big | 2
---+------------+-----------
5 | Small | 2
---+------------+-----------
4 | Big | 3
---+------------+-----------
5 | Small | 3
さて、誰かが私に入力を与えたとします['Computers', 'Laptops', 'Small']
。Postgres で階層を照会し、正しい最終カテゴリ (id 5 など) に到達するための最良の方法は何ですか?
再帰 CTE を使用してツリーをトラバースできることは知っていますが、入力配列をクエリにパラメーター化する最良の方法は何ですか?
以下は多かれ少なかれ機能しますが、パラメーター配列を分割する必要があるため、実際には標準以下のように感じます。
WITH RECURSIVE path(n, id, name, parent_id) AS (
SELECT
1, c.id, c.name, c.parent_id
FROM
categories c
WHERE c.name = 'Computers' AND parent_id IS NULL
UNION ALL
SELECT n+1, c.id, c.name, c.parent_id
FROM categories c,
(SELECT * FROM unnest(ARRAY['Laptops', 'Small']) WITH ORDINALITY np(name, m)) np,
path p
WHERE c.parent_id = p.id AND np.m = n AND np.name = c.name
)
SELECT * FROM path;