PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak wykonać tę samą agregację w każdej kolumnie, nie wymieniając kolumn?

Potrzebujesz dynamicznego SQL w tym celu, co oznacza, że ​​musisz utworzyć funkcję lub uruchomić DO Komenda. Ponieważ nie możesz zwrócić wartości bezpośrednio z tego ostatniego, funkcja plpgsql to jest:

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$;

Zadzwoń:

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

Zwroty:

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

Więcej wyjaśnień i linków na temat dynamicznego SQL i EXECUTE w tym powiązanym pytaniu - lub kilka innych tutaj na SO, wypróbuj tę wyszukiwarkę.

Bardzo podobne do tego pytania:
postgresql - liczba (bez wartości pustych) każdej kolumny w tabeli

Możesz nawet spróbować zwrócić polimorficzny typ rekordu, aby dynamicznie uzyskać pojedyncze kolumny, ale jest to dość złożone i zaawansowane. Prawdopodobnie za dużo wysiłku dla twojej sprawy. Więcej w tej powiązanej odpowiedzi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ogólne rozwiązanie Ruby dla SQLite3 LIKE czy PostgreSQL ILIKE?

  2. Jak stworzyć nową bazę danych z już zainstalowanym rozszerzeniem hstore?

  3. Jak zaimportować moduły lub zainstalować rozszerzenia w Postgresie?

  4. Czysty sposób na korzystanie z funkcji okna postgresql w django ORM?

  5. Zmienne zdefiniowane przez użytkownika w PostgreSQL