sql >> Database teknologi >  >> RDS >> PostgreSQL

Generer dynamisk kolonner til krydstabeller i PostgreSQL

Du kan bruge den medfølgende C-funktion crosstab_hash for dette.

Manualen er ikke særlig klar i denne henseende. Det er nævnt i slutningen af ​​kapitlet om crosstab() med to parametre:

Du kan oprette foruddefinerede funktioner for at undgå at skulle skrive resultatkolonnenavne og -typer ud i hver forespørgsel. Se eksemplerne i forrige afsnit. Den underliggende C-funktion for denne form for crosstab hedder crosstab_hash .

For dit eksempel:

CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
  RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Ring til:

SELECT * FROM f_cross_test_db(
      'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
     ,'SELECT DISTINCT key FROM test_db ORDER BY 1');

Bemærk, at du skal oprette en særskilt crosstab_hash funktion for hver crosstab funktion med en anden returtype.

Relateret:

  • PostgreSQL række til kolonner

Din funktion til at generere kolonnelisten er temmelig indviklet, resultatet er forkert (int mangler efter kernel_id ), kan den erstattes med denne SQL-forespørgsel:

SELECT 'kernel_id int, '
       || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
       || ' int, DUMMY text'
FROM   test_db;

Og det kan alligevel ikke bruges dynamisk.



  1. SSIS Tutorial for begyndere:Hvorfor, hvad og hvordan?

  2. SQLite aggregerede funktioner

  3. Rette "INSERT har flere udtryk end målkolonner" i PostgreSQL

  4. EXISTS vs JOIN og brug af EXISTS-klausulen