PostgreSQL 在递归查询中找到所有可能的组合(排列)

PostgreSQL find all possible combinations (permutations) in recursive query

输入是 'n' 长度的数组。我需要生成数组元素的所有可能组合,包括输入数组中元素较少的所有组合。

IN: j='{A, B, C ..}'
OUT: k='{A, AB, AC, ABC, ACB, B, BA, BC, BAC, BCA..}' 

随着重复,所以AB BA..

我试过这样的事情:

WITH RECURSIVE t(i) AS (SELECT * FROM unnest('{A,B,C}'::text[])) 
,cte AS (
    SELECT i AS combo, i, 1 AS ct 
    FROM t 
  UNION ALL 
    SELECT cte.combo || t.i, t.i, ct + 1 
    FROM cte 
    JOIN t ON t.i > cte.i
) 
SELECT ARRAY(SELECT combo FROM cte ORDER BY ct, combo ) AS result;

它正在生成没有重复的组合...所以我需要以某种方式修改它。

在递归查询中,删除迭代中使用的搜索 table 中的术语,然后对剩余记录重复查询。在您的情况下,这意味着一旦您处理了第一个数组元素 ("A"),它就不再可用于数组元素的进一步排列。要把那些"used"元素取回来,需要在递归查询中交叉连接table数组元素,然后过滤掉当前排列中已经使用的数组元素(position(t.i in cte.combo) = 0 ) 和停止迭代的条件 (ct <= 3).

WITH RECURSIVE t(i) AS (
  SELECT * FROM unnest('{A,B,C}'::char[])
), cte AS (
     SELECT i AS combo, i, 1 AS ct 
     FROM t 
   UNION ALL 
     SELECT cte.combo || t.i, t.i, ct + 1 
     FROM cte, t
     WHERE ct <= 3
       AND position(t.i in cte.combo) = 0
) 
SELECT ARRAY(SELECT combo FROM cte ORDER BY ct, combo) AS result;