sql >> Databasteknik >  >> RDS >> PostgreSQL

Generera dynamiskt kolumner för korstabell i PostgreSQL

Du kan använda den medföljande C-funktionen crosstab_hash för detta.

Manualen är inte särskilt tydlig i detta avseende. Det nämns i slutet av kapitlet om crosstab() med två parametrar:

Du kan skapa fördefinierade funktioner för att undvika att behöva skriva ut resultatkolumnnamn och typer i varje fråga. Se exemplen i föregående avsnitt. Den underliggande C-funktionen för denna form av crosstab heter crosstab_hash .

För ditt exempel:

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:

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');

Observera att du måste skapa en distinkt crosstab_hash funktion för varje crosstab funktion med en annan returtyp.

Relaterat:

  • PostgreSQL rad till kolumner

Din funktion för att generera kolumnlistan är ganska invecklat, resultatet är felaktigt (int saknas efter kernel_id ), kan den ersättas med denna SQL-fråga:

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

Och den kan inte användas dynamiskt ändå.



  1. FEL:relationsplatser finns inte Heroku db import

  2. Hur iif() fungerar i SQLite

  3. Snabbt sätt att generera sammanlänkade strängar i Oracle

  4. En översikt över de olika skanningsmetoderna i PostgreSQL