sql >> Databasteknik >  >> RDS >> PostgreSQL

postgresql - antal (inga nollvärden) för varje kolumn i en tabell

Den här frågan skapar DML-satsen för att få det du vill ha.

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

Returnerar:

SELECT count(col1), count(col2), count(col3), ...
FROM   mytbl

Du kan också köra det automatiskt. Men inte i plan SQL, du behöver EXECUTE i en plpgsql-funktion eller DO uttalande (PostgreSQL 9.0 eller senare) för det.

Du behöver också Postgres 9.0 eller senare för string_agg() fungera. I äldre versioner kan du ersätta:array_to_string(array_agg(...), ', ') .

Du kanske undrar över den speciella casten 'mytbl'::regclass . Läs mer om objektidentifieringstyper i manualen.

BTW:NULL värden läggs inte till i COUNT(col) som standard.

Byt ut mytbl med det (schemakvalificerade) tabellnamnet . I ditt fall borde det vara:

...
WHERE  attrelid = 'geoproject.mes_wastab'::regclass
...

Om du ska använda blandade skiftlägen eller på annat sätt trassliga identifierare (observera citattecken):

...
WHERE  attrelid = '"gEopRoject"."MES_wastab"'::regclass
...


  1. Dataingenjörsintervjufrågor med Python

  2. Du kan inte ange måltabell för uppdatering i FROM-satsen

  3. Hur man skriver komplexa frågor i SQL

  4. Mysql:Välj all data mellan två datum