sql >> Databáze >  >> RDS >> PostgreSQL

Dynamicky přidejte sloupec s více hodnotami do jakékoli tabulky pomocí funkce PL/pgSQL

Udělal jsem to pomocí refcursor pokud chcete, aby byl seznam výstupních sloupců zcela dynamický:

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;

Poté je třeba zavolat FETCH ALL IN získat výsledky. Podrobná syntaxe zde nebo tam:https://stackoverflow.com/a/12483222/630169 . Zdá se, že je to zatím jediná cesta. Doufám, že se něco změní v PostgreSQL 11 pomocí PROCEDURES.




  1. Jak implementovat obousměrný jedinečný index ve více sloupcích

  2. Nelze získat json z mysql varchar, ale int

  3. Proč si Oracle 10g nestěžuje na nejednoznačnost sloupců?

  4. získání názvu a hodnoty z atributu xmltype v oracle