我在Postgres 11.4中工作。我有一个带有jsonb列的表:
Table "public.feature_bundle_plan_feature"
Column | Type | Collation | Nullable | Default
-------------------+-----------------------------+-----------+----------+---------------
plan_feature_id | integer | | not null |
feature_bundle_id | integer | | not null |
value | jsonb | | | 'true'::jsonb
我可以像这样直接在jsonb value
列中存储对象:
insert into feature_bundle_plan_feature(plan_feature_id, feature_bundle_id, value)
values(1, 1, '{"foo":"bar"}');
但是,我似乎无法在CASE
语句中执行相同的操作:
update feature_bundle_plan_feature set value = case
when feature_bundle_id=1 then '{"foo":"bar"}'
end;
失败原因:
ERROR: column "value" is of type jsonb but expression is of type text
LINE 1: update feature_bundle_plan_feature set value = case
HINT: You will need to rewrite or cast the expression.
我做错了什么?
1条答案
按热度按时间ig9co6j11#
我在使用AWS RDS与Postgres + Kysely + GraphQL + Serverless Stack(SST)时遇到了同样的问题。我向API发送了一个字符串化的对象,并期望像正常一样插入它,但无济于事。我查看了Kysely的测试,注意到他们使用了一个原始的SQL查询来实际插入JSON,但令我惊讶的是,我遇到了同样的问题。幸运的是,我发现了这个线程,它提醒我尝试铸造与
::jsonb
,最后它的工作!一般来说,如果你遇到OP的特定错误消息,类似这样的东西应该可以工作:确切的语法当然取决于你使用的ORM,如果有的话,但主要的收获是这最终是一个Postgres错误,你需要手动将值转换为json/jsonb,如果使用ORM,可能会使用原始SQL。我希望这对某人有帮助!