PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Подпълнете масиви с NULL до максимална дължина за персонализирана агрегатна функция

Използване на персонализираната агрегатна функция array_agg_mult() както е дефинирано в този свързан отговор:

Вашият очакван резултат е невъзможен:

{{1},NULL,{abc}}

Трябва да бъде:

{{1},{NULL},{abc}}

Прост случай с 0 или 1 елемент на масив

За простия случай просто да замените празния масив:Можете да постигнете това с:

WITH t(arr) AS (
    VALUES
      ('{1}'::text[])
     ,('{}')
     ,('{abc}')
   )
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM   t;

Динамично подпълване за n елемента

Използване на array_fill() за допълване на масиви с NULL елементи до максималната дължина:

SELECT array_agg_mult(ARRAY[
         arr || array_fill(NULL::text
                         , ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
       ]) AS result
FROM   t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;

Все още работи само за 1-измерен основни масиви.

Обяснете

  • Подзаявка t1 изчислява максималната дължина на основния 1-измерен масив.
  • COALESCE(array_length(arr, 1), 0) изчислява дължината на масива в този ред.
    COALESCE по подразбиране е 0 за NULL .
  • Генериране на масив за допълване за разликата в дължината с array_fill() .
  • Добавете това към arr с ||
  • Агрегирайте както по-горе с array_agg_mult() .

SQL Fiddle. демонстриравсички .
Изходът в SQL Fiddle е подвеждащ, така че прехвърлих резултата към текст там.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да форматирам bigint поле в дата в Postgresql?

  2. Как да инсталирате PostgreSQL 12 на Ubuntu 20.04 DigitalOcean

  3. Подзаявка на PostgreSQL, използваща like

  4. Премахване на ключалки без pid в postgres

  5. Django OneToOneField с възможно празно поле