2

次のようなカテゴリの階層があるとします。

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;
4

1 に答える 1