2016-06-02 5 views
0

Ich habe 4 Unterabfragen, die Null + Zeilen von SMALLINT [] der Länge 1+ zurückgeben.Aggregiere 1D-Arrays verschiedener Länge in 2D-Array

Ich möchte alle Unterabfrageergebnisse in einer einzigen Zeile von SMALLINT [] [] aggregieren.

Da die Arrays unterschiedliche Längen haben, bin ich nicht sicher, wie man sie aufrollt? Die Verwendung der 9.5 ARRAY_AGG-Rückgabe "kann keine Arrays unterschiedlicher Dimensionalität ansammeln".

Antwort

1

Sie könnten Pad array mit NULL:

CREATE TABLE tab(col smallint[]); 

INSERT INTO tab(col) 
VALUES ('{1}'), ('{1,2}'), ('{1,2,3}'), ('{}'); 

SELECT array_agg(
      array_cat(
      col, 
      array_fill(NULL::smallint, ARRAY[l-COALESCE(array_length(col, 1),0)]) 
     ) 
     ) AS result 
FROM tab; 
,LATERAL (SELECT MAX(array_length(col,1)) AS l 
      FROM tab) s 

Ausgang:

╔═════════════════════════════════════════════════════╗ 
║      result      ║ 
╠═════════════════════════════════════════════════════╣ 
║ {{1,NULL,NULL},{1,2,NULL},{1,2,3},{NULL,NULL,NULL}} ║ 
╚═════════════════════════════════════════════════════╝ 
+0

Danke für die Zeit nehmen, diese kreative Antwort vorzubereiten. Ich hätte angeben sollen, dass ich eine "kompakte" 2D-Antwort ohne NULL-Werte suchte. Ich nehme an, es ist nicht das Ende der Welt, 4 Abfragen auszuführen und sie in der Anwendungslogik zusammenzufassen, aber ich bin ehrlich schockiert, dass dies mit reinem Postgres nicht möglich ist. –

Verwandte Themen