14 Stimmen

PL/pgSQL SELECT in ein Array

Hier ist meine Funktionsdeklaration und ein Teil des Rumpfes:

CREATE OR REPLACE FUNCTION access_update()
RETURNS void AS $$
DECLARE team_ids bigint[];
BEGIN
    SELECT INTO team_ids "team_id" FROM "tmp_team_list";

    UPDATE "team_prsnl"
    SET "updt_dt_tm" = NOW(), "last_access_dt_tm" = NOW()
    WHERE "team_id" IN team_ids;
END; $$ LANGUAGE plpgsql;

Ich möchte team_ids ein Array von Ints zu sein, das ich dann in der UPDATE Erklärung. Diese Funktion gibt mir Fehler wie diesen:

psql:functions.sql:62: ERROR:  syntax error at or near "team_ids"
LINE 13:  AND "team_id" IN team_ids;

15voto

Erwin Brandstetter Punkte 530399

Schneller und einfacher mit einer FROM Klausel in Ihrem UPDATE Anweisung :

UPDATE team_prsnl p
SET    updt_dt_tm = now()
     , last_access_dt_tm = now()
FROM   tmp_team_list t
WHERE  p.team_id = t.team_id;

Abgesehen davon ist bei der Arbeit mit einem Array die WHERE Klausel lauten müsste:

WHERE p.team_id = ANY (team_ids)

Les IN Konstrukt funktioniert mit Listen oder Mengen, nicht mit Arrays. Siehe:

5voto

dsh Punkte 11766

So erstellen Sie ein Array aus einer SELECT :

# select array(  select id from tmp_team_list ) ;
 ?column? 
----------
 {1,2}
(1 row)

Les IN Betreiber ist dokumentiert als eine Unterabfrage für den rechten Operanden. Zum Beispiel:

UPDATE team_prsnl SET updt_dt_tm = NOW()
 WHERE team_id IN (SELECT id FROM tmp_team_list);

Vielleicht können Sie das Array ganz vermeiden, oder versuchen, das Array oder select from team_ids .

0voto

Mark Punkte 1523

Eine kleine Anpassung auf der Grundlage anderer Antworten.
Wenn die team_id ist ein normaler int-Datentyp.

   UPDATE team_prsnl p
    SET    updt_dt_tm = now()
          ,last_access_dt_tm = now()
    FROM   tmp_team_list t
    WHERE  p.team_id = any(array(select team_id from t));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X