У мене є помічник, який генерує якийсь код, щоб робити масові оновлення для мене та генерувати SQL, який виглядає приблизно так:
(І активні, і основні поля мають тип 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;
Однак це не вдається:
ERROR: column "core" is of type boolean but expression is of type text
Я можу змусити його працювати, додавши ::boolean
до нулів, але це здається дивним, чому NULL вважається типом TEXT
?
Крім того, це досить складно для передачі, тому що знадобиться зовсім небагато переробляти код, щоб він знав, до якого типу він повинен видавати NULLs (список стовпців і значень в даний час автогенерується з простого масиву об'єктів JSON) .
Чому це необхідно і чи існує більш елегантне рішення, яке не вимагає генеруючого коду, щоб знати тип NULL?
Якщо це доречно, я використовую секелізацію над Node.JS для цього, але я отримую такий же результат і в клієнті командного рядка Postgres.
Cannot cast type boolean to bigint in column 1
(пункти помилок у :: між першим висловом поля)