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

Как да извършите едно и също агрегиране на всяка колона, без да изброявате колоните?

Нуждаете се от динамичен SQL за това, което означава, че трябва да създадете функция или да изпълните DO команда. Тъй като не можете да върнете стойности директно от последния, функция plpgsql това е:

CREATE OR REPLACE function f_count_all(_tbl text
                           , OUT columns text[], OUT counts bigint[])
  RETURNS record LANGUAGE plpgsql AS
$func$
BEGIN

EXECUTE (
    SELECT 'SELECT
     ARRAY[' || string_agg('''' || quote_ident(attname) || '''', ', ') || '], 
     ARRAY[' || string_agg('count(' || quote_ident(attname) || ')', ', ') || ']
    FROM ' || _tbl
    FROM   pg_attribute
    WHERE  attrelid = _tbl::regclass
    AND    attnum  >= 1           -- exclude tableoid & friends (neg. attnum)
    AND    attisdropped is FALSE  -- exclude deleted columns
    GROUP  BY attrelid
    )
INTO columns, counts;

END
$func$;

Обадете се:

SELECT * FROM f_count_all('myschema.mytable');

Връща:

columns       | counts
--------------+--------
{c1, c2, c3,} | {17 1,0}

Още обяснения и връзки за динамичния SQL и EXECUTE в този свързан въпрос - или още няколко тук на SO, опитайте това търсене.

Много подобно на този въпрос:
postgresql - брой (без нулеви стойности) на всяка колона в таблица

Можете дори да опитате да върнете полиморфен тип запис, за да получите единични колони динамично, но това е доста сложно и напреднало. Вероятно твърде много усилия за вашия случай. Повече в този свързан отговор.




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

  2. Как да изтрия стойност на тип enum в postgres?

  3. PostgreSQL:имена на ограничения по подразбиране

  4. Поточно репликация на PostgreSQL срещу логическа репликация

  5. Продължавам да получавам връзката за грешка [TABLE] не съществува