2016-07-17 14 views
1

Ich möchte eine vorbereitete Anweisung nutzen, um postgres db einzufügen/zu aktualisieren. Die Sache ist, dass die Tabelle nullwertfähige Spalten enthält, für die ich in Runtime möglicherweise einen Wert habe oder nicht.
Falls ich nichts zum Einfügen/Aktualisieren habe, muss ich den alten Wert beibehalten.
Gibt es eine Syntax, die ich für diesen Fall verwenden kann?
Was sind die besten Praktiken in solchen Fällen, scheint es ein sehr häufiges Problem?Wie gehe ich mit optionalen Spalten beim Erstellen einer vorbereiteten Anweisung um?

P.S Ich benutze Java/Scala mit plain jdbc.

Antwort

2

Sie könnten natürlich nur eine Anweisung ohne die Spalten erstellen, die Sie nicht aktualisieren möchten.

Wenn dies in Ihrem Anwendungsfall keine Option ist, können Sie einen Case-Ausdruck mit einem "Flag" erstellen, um anzugeben, ob die Spalte gebunden werden soll oder nicht.

Z. B .:

String sql = "UPDATE mytable " + 
      "SET " + 
      "col1 = CASE(? WHEN 1 THEN ? ELSE col1 END), " + 
      "col2 = CASE(? WHEN 1 THEN ? ELSE col2 END) " + 
      "WHERE id = ?"; 

PreparedStatement ps = con.prepareStatement(sql); 

// col1 should be updated 
ps.setInt(1, 1); 
ps.setString(2, newValueCol1); 

// col2 should not be updated 
ps.setInt(3, 0); 
ps.setString(4, null); // or any other value... 

// bind the where clause 
ps.setInt(5, someId); 

ps.executeUpdate(); 

// close resources and clean up, omitted for brevity's sake 
+1

Dank. Die Flag-Option sieht genau wie ich aus. Würde es auch für die INSERT-Anweisung funktionieren? –

+0

Ich meinte einen Standardwert einfügen, wenn kein Wert angegeben ist. –

+0

@EliGolin können Sie den 'case' Ausdruck in einer' values' Klausel einer 'insert' Anweisung verwenden. – Mureinik