2016-07-25 12 views
1

Folgende ist meine SQL-Abfrage vergleichen:POSTGRESQL nicht in der Lage null Spalten

update table 
set unit_id = T1.unit_id_temp from 
     (select case when unit_id4 is not null then unit_id4 
     when unit_id3 is not null then unit_id3 
     when unit_id2 is not null then unit_id2 
     when unit_id1 is not null then unit_id1 
     else unit_id 
     end as unit_id_temp, 
     unit_id1,unit_id2,unit_id3,unit_id4 
     from table) T1 
where table.unit_id4 = T1.unit_id4 
and table.unit_id3 = T1.unit_id3 
and table.unit_id2 = T1.unit_id2 
and table.unit_id1 = T1.unit_id1 

Aus der obigen Abfrage Ich kann keine Spalten vergleichen, wenn sie NULL sind, als die Bedingung falsch zurückgibt.

Beispiel: wenn unit_id4 null ist, table.unit_id4 = T1.unit_id4 gibt False zurück.

Daher schlägt meine Aktualisierung fehl, wenn eine der Spalten NULL-Werte enthält.

Ich versuchte mit nicht unterscheidet sich von, es funktioniert nicht. Werfe den folgenden Fehler:

UPDATE - 0 Zeilen, 0.000 Sek] [Code: 0, SQL-Status: 42601] ERROR: Syntaxfehler bei oder in der Nähe von "distinct"

Antwort

3

Ich glaube, Sie Ihre gesamte Abfrage ersetzen können dies: dass

UPDATE table 
SET unit_id = COALESCE(unit_id4, unit_id3, unit_id2, unit_id1) 
WHERE COALESCE(unit_id4, unit_id3, unit_id2, unit_id1) IS NOT NULL 

Es scheint mir, dass Ihre Logik ist die unit_id Spalte unit_id4, unit_id3, unit_id2, unit_id1, wenn eine dieser Spalten in dieser Reihenfolge nicht NULL, zu aktualisieren. Die COALESCE Funktion funktioniert gut für diesen Anwendungsfall. Für den Fall, dass alle vier Spalten sind NULL, die Logik in Ihrem UPDATE ist einfach den gleichen Wert zurück zuweisen unit_id. Die WHERE-Klausel in meiner Abfrage verhindert, dass die UPDATE sogar in Datensätzen ausgeführt wird, in denen alle vier Einheitenspalten NULL sind, so dass es nie zu verschwendeten Bemühungen kommen wird.

+0

Okay., Es tut mir so leid, dass ich ein paar Informationen verpasst habe: Ich probiere das auf AWS Redshift. Ich habe die vorherige Abfrage bereits ausprobiert, und was ich bekam, war: "Zieltabelle muss Teil eines Equijoin-Prädikats sein" – Renukadevi

+0

Ich würde Ihre ursprüngliche Abfrage löschen, wenn ich Sie wäre, weil ich denke, dass es einfacher umgeschrieben werden kann. –

+0

urghhhh., Danke viel .. das macht mich dumm .. Es ist mir nicht klar, COALESCE zu verwenden. – Renukadevi