2016-06-02 2 views
0

У меня есть 4 подзапроса, возвращающих нуль + строки SMALLINT [] длины 1+.Совокупность 1D массивов различной длины в 2D-массив

Я хотел бы объединить все результаты подзапроса в одну строку SMALLINT [] [].

Поскольку массивы имеют разную длину, я не уверен, как их свертывать? Использование 9.5 ARRAY_AGG возвращает «не может накапливать массивы различной размерности».

ответ

1

Вы могли бы подушечка array с 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 

Выход:

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

Благодарим Вас за время, чтобы подготовить этот творческий ответ. Я должен был указать, что я искал «компактный» 2D-ответ без значений NULL. Я полагаю, что это не конец света для запуска 4 запросов и их свертывания в логике приложений, но я откровенно шокирован, что это невозможно сделать с чистым Postgres. –

Смежные вопросы