Postgres 不能将类型 jsonb 转换为整数

Кир*_*кий 6 postgresql json join

有两张桌子。

表格1

 id integer
 color_name character(64) 
Run Code Online (Sandbox Code Playgroud)

表2

 id integer
 jdata jsonb
Run Code Online (Sandbox Code Playgroud)

Json 数据如下所示:

{"price": 4500, "colorId": 5}
Run Code Online (Sandbox Code Playgroud)

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

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

我收到一个错误:

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

我也试过执行这个:

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

我得到了什么:

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

OTA*_*TAR 7

我认为你需要这个:

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

  • @КириллТабельский - 您确定使用“->>”运算符而不是“->”吗? (5认同)
  • @Shayne,如果你使用 `(col ->> 'field')::integer` ,它对我有用,但它似乎是通过文本进行的,所以有点慢。有一个补丁可以直接从 jsonb 转换为数字:https://www.postgresql.org/message-id/9c013081-5dc0-1b87-a559-a0c2d405727a%40postgrespro.ru (3认同)

Ale*_*lov 7

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

'value' 是可变的 jsonb 类型。

例如:

select  cast(to_jsonb('3'::text) #>> '{}' as integer)
Run Code Online (Sandbox Code Playgroud)