【问题标题】:Postgres cannot cast type jsonb to integerPostgres 无法将类型 jsonb 转换为整数
【发布时间】:2019-02-26 16:25:57
【问题描述】:

一共有两张表。

表1

 id integer
 color_name character(64) 

表2

 id integer
 jdata jsonb

Json 数据如下:

{"price": 4500, "colorId": 5}

我需要输出颜色和按颜色分组的项目数,所以我尝试使用此查询:

SELECT Table1.color_name, Table2.jdata ->> 'colorId', count(*)
FROM Table1
INNER JOIN Table2
ON Table1.id = Table2.jdata ->> 'colorId'
group by Table2.jdata ->> 'colorId';

我收到一个错误:

错误:运算符不存在:整数 = jsonb

我也试过执行这个:

select Table1.color_name, count(*) 
from Table1
join Table2
on (Table2.jdata->>'colorId')::int = Table1.id
group by Table1.color_name

我得到了什么:

错误:无法将类型 jsonb 转换为整数

【问题讨论】:

  • 显示最小样本数据,然后显示预期输出
  • 您使用的是哪个数据库版本?
  • 注意,这似乎已在 Postgres 11 中修复。

标签: json postgresql join


【解决方案1】:

我认为你需要这个:

select Table1.color_name, count(*) 
from Table1
join Table2
on (Table2.jdata->>'colorId')::int = Table1.id
group by Table1.color_name

【讨论】:

  • 谢谢!但是发生了新错误:“错误:无法将类型 jsonb 转换为整数”
  • @КириллТабельский 这适用于 Postgres 9.4 及更高版本:dbfiddle.uk/…
  • @КириллТабельский - 你确定使用->> 运算符而不是-> 吗?
  • 有解决办法吗?
  • @Shayne 如果您使用(col ->> 'field')::integer,它对我有用,但它似乎是通过文本传递的,所以它有点慢。有一个补丁可以直接从 jsonb 转到 numeric:postgresql.org/message-id/…
【解决方案2】:

解决此问题的简单方法:select cast(value #>> '{}' as integer)

'value'是可变jsonb类型。

例如:

select  cast(to_jsonb('3'::text) #>> '{}' as integer)

【讨论】:

    【解决方案3】:

    上下文:将jsonb 转换为int 无法正常工作。

    解决方案:尝试换一种方式。如果您尝试将int 与jsonb 匹配,您仍然会收到错误消息,因此您可以尝试以下操作:

    SELECT Table1.color_name, count(*) 
      FROM Table1
        JOIN Table2 ON Table2.jdata->'colorId' = Table1.id::text::jsonb
      GROUP BY Table1.color_name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 2021-01-26
      • 2020-08-11
      • 1970-01-01
      • 2021-06-15
      相关资源
      最近更新 更多