Mam pomocnika, który generuje dla mnie trochę kodu do wykonywania aktualizacji zbiorczych i generuje SQL, który wygląda następująco:
(Zarówno aktywne, jak i podstawowe pola są typu 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;
Jednak nie udaje się to z:
ERROR: column "core" is of type boolean but expression is of type text
Mogę sprawić, że zadziała, dodając ::boolean
do wartości zerowych, ale to wydaje się dziwne, dlaczego NULL jest uważany za typ TEXT
?
Jest to również trochę trudne do rzutowania, ponieważ wymagałoby to sporo przeróbki kodu, aby mógł wiedzieć, na jaki typ powinien rzutować wartości NULL (lista kolumn i wartości jest obecnie automatycznie generowana z prostej tablicy obiektów JSON) .
Dlaczego jest to konieczne i czy istnieje bardziej eleganckie rozwiązanie, które nie wymaga generowania kodu, aby znać typ wartości NULL?
Jeśli to istotne, używam do tego sekwencjonowania przez Node.JS, ale otrzymuję ten sam wynik w kliencie poleceń Postgres.
źródło
Cannot cast type boolean to bigint in column 1
(błąd wskazuje na instrukcję :: między pierwszym polem)fields
ma 3 kolumny,(active, core, id)
z typami boolean, boolean i int / bigint. Czy twoja tabela ma więcej kolumn lub różnych typów, czy kolumny są zdefiniowane w innej kolejności?