2015-05-27 51 views
1

無法弄清楚如何在不重複的情況下組合數組。與排列不同的PostgreSQL組合

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"}" 
+0

既然你坦率地標註這是一個學校的項目,你真的應該解決這個你自己。提示:因爲您正在使用字符串,請查看[字符串函數](http://www.postgresql.org/docs/current/static/functions-string.html)。 – Patrick

+0

您正在尋找的是「組合」,與「排列組合」截然不同。算法做到這一點是有據可查的。 –

+1

...如果您在Stack Overflow上搜索「postgresql組合」,也有許多現有答案。是什麼讓這個不同? (順便說一句,請不要使用像這樣的字符串連接構建數組;使用unnest和array_agg或'ARRAY [']'構造函數 –

回答

0
WITH RECURSIVE 

    A(i) AS (SELECT * FROM unnest(ARRAY['A,B'])), 
    B(j) AS (SELECT * FROM unnest(ARRAY['A','B','C','D'])), 

    cte AS ( SELECT j AS combo, j, 1 AS ct 
       FROM B 
      UNION ALL 
       SELECT cte.combo ||','||B.j, B.j, ct + 1 
       FROM cte, B 
       WHERE ct <= 4 
       AND position(B.j in cte.combo) = 0 
      ) 
    , com AS (SELECT A.i ||','|| B.j AS cmb 
       FROM A 
       CROSS JOIN B) 

    SELECT ARRAY(SELECT cmb FROM cte,com where cte.combo = com.cmb)