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

Dynamicznie generuj kolumny dla tabeli krzyżowej w PostgreSQL

Możesz użyć dostarczonej funkcji C crosstab_hash w tym celu.

Instrukcja nie jest pod tym względem bardzo jasna. Jest to wspomniane na końcu rozdziału o crosstab() z dwoma parametrami:

Możesz tworzyć predefiniowane funkcje, aby uniknąć konieczności zapisywania nazw i typów kolumn wynikowych w każdym zapytaniu. Zobacz przykłady w poprzedniej sekcji. Podstawowa funkcja C dla tej postaci crosstab ma nazwę crosstab_hash .

Na przykład:

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;

Zadzwoń:

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

Pamiętaj, że musisz utworzyć odrębny crosstab_hash funkcja dla każdej crosstab funkcja z innym typem zwracania.

Powiązane:

  • PostgreSQL wiersz do kolumn

Twoja funkcja generowania listy kolumn jest raczej zawiły, wynik jest niepoprawny (int brakuje po kernel_id ), można go zastąpić następującym zapytaniem SQL:

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

I tak nie można go używać dynamicznie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz wiersze, których nie ma w innej tabeli

  2. Sterownik JDBC PostgreSQL z systemem Android

  3. Wyzwalacz z dynamiczną nazwą pola

  4. Automatyczne zwiększanie częściowego klucza podstawowego za pomocą Entity Framework Core

  5. Jak przekonwertować ciąg na znacznik czasu bez strefy czasowej?