sql >> Database >  >> RDS >> PostgreSQL

Voeg dynamisch een kolom met meerdere waarden toe aan een tabel met behulp van een PL/pgSQL-functie

Ik deed dit met refcursor als u wilt dat de lijst met uitvoerkolommen volledig dynamisch is:

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;

Bel dan FETCH ALL IN resultaten te krijgen. Gedetailleerde syntaxis hier of daar:https://stackoverflow.com/a/1283222/630169 . Het lijkt erop dat dit voorlopig de enige manier is. Ik hoop dat er iets zal worden veranderd in PostgreSQL 11 met PROCEDURES.




  1. Draaitabel voor gegevens per uur

  2. PRIMARY KEY-definitie in MySQL CREATE TABLE-instructie

  3. mysql telling-prestaties

  4. MySQL geeft alle duplicaten weer