【发布时间】:2015-05-27 00:16:07
【问题描述】:
不知道如何在不重复的情况下组合数组。
INPUT is an array of n variables LIKE '{A,B,C,D,E}'
Variable A is always single array LIKE '{"A"}' or '{"D,C"}' or '{"D,A,B"}' etc..
What I need is to combine INPUT with A(i)
EXAMPLE:
1. A = '{"B"}' --> att='{"B,A","B,C","B,D","B,E"}'
2. A = '{"B,C"}' --> att='{"B,C,A","B,C,D","B,C,E"}'
3. A = '{"B,C,A"}' --> att='{"B,C,A,D","B,C,A,E"}'
4. A = '{"B,C,A,D"}' --> att='{"B,C,A,D,E"}'
据我所知:
WITH A(i) AS (SELECT * FROM unnest(ARRAY['A,B'])),
B(j) AS (SELECT * FROM unnest(ARRAY['A','B','C','D'])),
cte AS ( SELECT A.i ||','|| B.j
FROM A
CROSS JOIN B
)
SELECT ARRAY ( SELECT * FROM cte) INTO att;
但它会造成重复:
"{"A,B,A","A,B,B","A,B,C","A,B,D"}"
【问题讨论】:
-
既然你坦率地说这是一个学校项目,你应该自己解决这个问题。提示:由于您使用的是字符串,请查看string functions。
-
您正在寻找的正是与“排列”不同的“组合”。执行此操作的算法有据可查。
-
...如果您在 Stack Overflow 上搜索“postgresql 组合”,也有许多现有答案。是什么让这与众不同? (顺便说一句,请不要像这样使用字符串连接构建数组;使用 unnest 和 array_agg 或
ARRAY[...]构造函数 -
正如@CraigRinger 所说(以及问题中的OP):使用
unnest()函数。为避免多个自连接和多个a.x <> b.y子句,您可以使用递归CTE(使用candidate_element <> ALL( cte_array_expression_here)并通过限制递归深度来限制最大元素数。
标签: sql arrays postgresql combinations permutation