Postgres无法将jsonb类型转换为整数

时间:2018-09-22 14:32:01

标签: json postgresql join

这里有两个表。

表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';

我得到一个错误:

  

错误:运算符不存在:integer = jsonb

我也尝试执行此操作:

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

我得到的是

  

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

3 个答案:

答案 0 :(得分:3)

我认为您需要这个:

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

答案 1 :(得分:0)

上下文:将class InvoiceAdmin(admin.ModelAdmin): inlines = [InvoiceItemInline] def save_related(self, request, form, formsets, change): invoice = form.instance invoice.total = 0 for inlines in formsets: for inline_form in inlines: invoice.total = invoice.total + inline_form.cleaned_data.get('price') * inline_form.cleaned_data.get('quantity') invoice.save() super(InvoiceAdmin, self).save_related(request, form, formsets, change) 投射到jsonb不能正常工作。

解决方案:尝试采用其他方法。如果您尝试将intint匹配,您仍然会收到错误消息,因此您可以尝试以下操作:

jsonb

答案 2 :(得分:0)

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

'value' 是变量 jsonb 类型。

例如:

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