2016-08-01 4 views
1

Es gibt einen Alias ​​für "alten Wert" in der ON CONFLICT DO UPDATE?Wie Sie OLD.X bei ON CONFLICT DO UPDATE SET beziehen X = OLD.X + EXCLUDED.X


Mein wahres Leben Problem ist

INSERT INTO art.validterm (namespace,term,X,info) 
    SELECT namespace,term,array_agg(Xi), 'etc' 
    FROM term_raw_Xs 
    GROUP BY namespace,term 
ON CONFLICT (term) DO 
    UPDATE SET aliases=OLD.X||EXCLUDED.X 
    WHERE term=EXCLUDED.term 

PS: nein "OLD" existiert, ist die Frage. Der Parser sagt, dass nur X ambig ist.

Antwort

2

Einfach ersetzen OLD mit dem Namen der Tabelle, in Ihrem Fall: validterm, arbeitete für mich.

Mein Test:

DROP TABLE IF EXISTS work.term_raw; 

CREATE TABLE work.term_raw 
(
unique_field INT UNIQUE, 
x_field TEXT 
); 

INSERT INTO work.term_raw VALUES (1, 'A'); 

INSERT INTO work.term_raw VALUES (1, 'B') 
ON CONFLICT (unique_field) DO UPDATE SET x_field = term_raw.x_field || EXCLUDED.x_field; 

SELECT * FROM work.term_raw; 

Mein Ergebnis: (!)

enter image description here

+1

Danke, richtig. Eine andere (getestete) Lösung ist die Verwendung eines Alias ​​'... INSERT INTO work.term_raw AS tt WERTE (...) ... SET x_field = tt.x_field || ... '. –

+0

@klin - Ich bin mir nicht sicher, ob ich folge - ich habe in meiner Antwort keine WHERE-Klausel angegeben. – Nicarus

+0

@ Nicarus- aber Peter tat. – klin

Verwandte Themen