PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Динамично генериране на колони за кръстосана таблица в PostgreSQL

Можете да използвате предоставената функция C crosstab_hash за това.

Ръководството не е много ясно в това отношение. Споменато е в края на главата за crosstab() с два параметъра:

Можете да създадете предварително дефинирани функции, за да избегнете необходимостта да изписвате имена на колони и типове на резултатите във всяка заявка. Вижте примерите в предишния раздел. Основната функция C за тази форма на crosstab се нарича crosstab_hash .

За вашия пример:

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;

Обадете се:

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

Имайте предвид, че трябва да създадете отделен crosstab_hash функция за всяка crosstab функция с различен тип връщане.

Свързано:

  • PostgreSQL ред към колони

Вашата функция за генериране на списък с колони е доста объркан, резултатът е неправилен (int липсва след kernel_id ), може да бъде заменен с тази SQL заявка:

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

И така или иначе не може да се използва динамично.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Конкатениране на низ и число в PostgreSQL

  2. Собственикът на базата данни на postgresql няма достъп до базата данни - Няма намерени връзки.

  3. Запазете изхода на PL/pgSQL от PostgreSQL в CSV файл

  4. PostgreSQL сървърът няма да се изключи на Lion (Mac OS 10.7)

  5. PL/pgSQL функции:Как да върнете нормална таблица с множество колони с помощта на оператор за изпълнение