У мене є помічник, який генерує якийсь код, щоб робити масові оновлення для мене та генерувати 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(пункти помилок у :: між першим висловом поля)