postgresql 更新CASE语句中的jsonb列:“列的类型为jsonb,但表达式的类型为text”

nx7onnlm  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(253)

我在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.

我做错了什么?

ig9co6j1

ig9co6j11#

我在使用AWS RDS与Postgres + Kysely + GraphQL + Serverless Stack(SST)时遇到了同样的问题。我向API发送了一个字符串化的对象,并期望像正常一样插入它,但无济于事。我查看了Kysely的测试,注意到他们使用了一个原始的SQL查询来实际插入JSON,但令我惊讶的是,我遇到了同样的问题。幸运的是,我发现了这个线程,它提醒我尝试铸造与::jsonb,最后它的工作!一般来说,如果你遇到OP的特定错误消息,类似这样的东西应该可以工作:

SQL.DB.insertInto('table_with_jsonb_column')
  .values({
    jsonb_column: sql`${stringified_json_object}::jsonb`
    ...
  }

确切的语法当然取决于你使用的ORM,如果有的话,但主要的收获是这最终是一个Postgres错误,你需要手动将值转换为json/jsonb,如果使用ORM,可能会使用原始SQL。我希望这对某人有帮助!

相关问题