PostgreSQL查询jsonb字段属性值报语法错误的解决方法
错误原因
两次报错均来自对PostgreSQL jsonb操作符的误用:
->操作符获取jsonb字段属性后,返回值仍为jsonb类型。第一次查询时,你拿jsonb类型结果和text类型字符串直接比对,数据库会尝试将右侧的普通字符串解析为json格式,解析到空格分隔的Changedtoken时就会触发语法错误——合法的json字符串必须包裹在双引号内。- PostgreSQL不存在
->->这个操作符,第二次查询属于操作符书写错误,因此直接触发无匹配操作符的报错。
正确实现方式
如果要获取jsonb字段中属性的原生文本值,需要使用->>操作符,该操作符返回值为text类型,可以直接和普通字符串做等值比对,正确SQL如下:
select * from event where type = 'pickup-data-changed' and data ->> 'comment' = 'Changed by recipient';
补充说明
你也可以通过显式类型转换的方式实现同等效果,但这种写法更冗余,且容易因为json转text自带的双引号踩坑,日常使用优先选->>即可:
-- 不推荐的冗余写法,::text转换后的json字符串自带外层双引号,比对时需要手动补上 select * from event where type = 'pickup-data-changed' and (data -> 'comment')::text = '"Changed by recipient"';
内容的提问来源于stack exchange,提问作者Ludwig
相关产品推荐
相关产品推荐

