Ich habe einen Helfer, der Code generiert, um Massenaktualisierungen für mich durchzuführen, und SQL generiert, das so aussieht:
(Sowohl das aktive als auch das Kernfeld sind vom Typ boolean
)
UPDATE fields as t set "active" = new_values."active","core" = new_values."core"
FROM (values
(true,NULL,3419),
(false,NULL,3420)
) as new_values("active","core","id") WHERE new_values.id = t.id;
Es schlägt jedoch fehl mit:
ERROR: column "core" is of type boolean but expression is of type text
Ich kann es durch Hinzufügen ::boolean
zu den Nullen zum Laufen bringen, aber das scheint nur seltsam, warum wird NULL als Typ betrachtet TEXT
?
Das Casting ist auch etwas schwierig, da es eine ziemliche Überarbeitung des Codes erfordern würde, um zu wissen, in welchen Typ NULLs umgewandelt werden sollen (die Liste der Spalten und Werte wird derzeit automatisch aus einem einfachen Array von JSON-Objekten generiert). .
Warum ist dies notwendig und gibt es eine elegantere Lösung, bei der der generierende Code nicht erforderlich ist, um den Typ der NULL-Werte zu kennen?
Wenn es relevant ist, verwende ich dazu Sequelize über Node.JS, erhalte aber auch das gleiche Ergebnis im Postgres-Befehlszeilenclient.
quelle
Cannot cast type boolean to bigint in column 1
(die Fehlerpunkte bei :: zwischen den ersten Feldern)fields
3 Spalten(active, core, id)
mit den Typen Boolean, Boolean und Int / Bigint enthält. Hat Ihre Tabelle mehr Spalten oder verschiedene Typen oder sind die Spalten in unterschiedlicher Reihenfolge definiert?