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 ::booleando 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.
Cannot cast type boolean to bigint in column 1(błąd wskazuje na instrukcję :: między pierwszym polem)