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

Dynamicznie dodawaj kolumnę z wieloma wartościami do dowolnej tabeli za pomocą funkcji PL/pgSQL

Zrobiłem to za pomocą refcursor jeśli chcesz, aby lista kolumn wyjściowych była całkowicie dynamiczna:

CREATE OR REPLACE FUNCTION is_record_exists(tablename character varying, columns character varying[], keepcolumns character varying[] DEFAULT NULL::character varying[])
    RETURNS SETOF refcursor AS
$BODY$

DECLARE 
    ref refcursor;
    keepColumnsList text;
    columnsList text; 
    valuesList text;
    existQuery text;
    keepQuery text;
BEGIN
    IF keepcolumns IS NOT NULL AND array_length(keepColumns, 1) > 0 THEN
        keepColumnsList :=  array_to_string(keepColumns, ', ');
    ELSE
        keepColumnsList :=  'COUNT(*)';
    END IF;

    columnsList := (SELECT array_to_string(array_agg(name || ' = ' || value), ' OR ') FROM
        (SELECT unnest(columns[1:1]) AS name, unnest(columns[2:2]) AS value) pair);

    existQuery := 'SELECT ' || keepColumnsList || ' FROM ' || tableName || ' WHERE ' || columnsList;
    RAISE NOTICE 'Exist query: %', existQuery;

    OPEN ref FOR EXECUTE
        existQuery;
    RETURN next ref;
END;$BODY$
  LANGUAGE plpgsql;

Następnie musisz zadzwonić FETCH ALL IN aby uzyskać wyniki. Szczegółowa składnia tutaj lub tam:https://stackoverflow.com/a/12483222/630169 . Wygląda na to, że na razie to jedyny sposób. Mam nadzieję, że coś się zmieni w PostgreSQL 11 za pomocą PROCEDUR.




  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 - zwróć cały wiersz jako tablicę

  2. Narzędzie GUI dla PostgreSQL

  3. Jak włączyć Postgis Query w Spark SQL?

  4. PostgreSQL:Dlaczego to zapytanie nie używa mojego indeksu?

  5. Nie znaleziono odpowiedniego sterownika po dołączeniu potrzebnych sterowników do wtyczki maven-assembly-plugin