Funktion - Count jeder Spalte ermitteln

Hallo,

ich muss für jede Spalte den count (also ohne NULL Werte) aller Einträge einer Tabelle mit sehr vielen Spalten ermitteln. Folgende Funktion ermittelt erfolgreich die Spaltennamen, jedoch erhalte ich keine Anzahl?

Kann da jemand weiterhelfen?

CREATE OR REPLACE FUNCTION oegp.columncount() RETURNS TABLE (p_name VARCHAR, p_count BIGINT)
AS $$
DECLARE
    columns RECORD;
    --sql_select text;

BEGIN
    FOR columns IN SELECT column_name FROM information_schema.columns WHERE table_schema='oegp' and table_name ='fd_mastab01' LOOP
        p_name := columns.column_name;
        p_count := p_count || 'count('|| columns.column_name || ') from oegp.fd_mastab01';
    RETURN NEXT;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Aufruf:

select  * from oegp.columncount();

ps.: ist mein erster Versuch mit plpgsql, bitte habt Nachsicht falls o.g. totaler Unsinn ist

Nach meinen Beobachtungen enthält eine Tabelle in allen Spalten meist die gleiche Anzahl von Zeilen.


Andreas

Richtig. Aber ich will ja den count jeder Spalte ermitteln welcher NULL Werte nicht mitzählt.
Ich habe meine Frage dahingehend korrigiert.

Okay.

Deine äußere LOOP-Schleife, denke ich mal, tut, was Du willst.
Aber p_count, das ist initial NULL, und ein NULL || ‘foo’ ist wieder NULL.
Weiterhin - was soll mit dem String innerhalb der Funktion passieren?


Andreas

Erwischt! Da habe ich ohne zu wissen was ich genau mache abgeschrieben.
Eigentlich wollte ich ja den count so abfragen:

p_count := ‘select count(’|| columns.column_name || ‘) from oegp.fd_mastab01’;

aber da erhalte ich beim Ausführen der Funktion folgenden Fehler:

ERROR: invalid input syntax for integer: “select count(acridin) from oegp.fd_mastab01”



Weiterhin - was soll mit dem String innerhalb der Funktion passieren?

Was genau meinst du?

Danke schonmal für die Hilfe.

Du hast also eine INT-Variable, der Du einen STRING zuweisen willst. Oder willst Du einen String mittels EXECUTE ausführen, und das Resultat Deiner INT-Variablen übergeben?


Andreas

Ich hätte natürlich gerne das Resultat in meiner INT-Variablen. Also muss ich wohl den SQL Befehl mit execute ausführen?

So geht es dann:

CREATE OR REPLACE FUNCTION oegp.columncount() RETURNS TABLE (p_name VARCHAR, p_count BIGINT) 
AS $$ 
DECLARE     
  columns RECORD;     
  sql_select text;  

BEGIN     
  FOR columns IN SELECT column_name FROM information_schema.columns WHERE table_schema='oegp' and table_name ='fd_mastab01' LOOP         
    p_name := columns.column_name;         
    sql_select := 'select count('|| columns.column_name || ') from oegp.fd_mastab01';
    EXECUTE sql_select into p_count;     
    RETURN NEXT;     
  END LOOP; 
END; 
$$ LANGUAGE plpgsql;

Danke für die Hilfestellung.