PostgreSQL 17.4中json_value()处理布尔值的行为疑问
这不是PostgreSQL的Bug,是预期行为
这两种写法的差异来自json_value函数的返回类型逻辑:
- 当你省略
returning jsonb时,json_value会将JSON值转换为对应的SQL原生标量类型。JSON的true对应PostgreSQL的boolean类型,而PostgreSQL中布尔值的文本表示就是t(真)和f(假),所以转成text后得到't'。 - 当你指定
returning jsonb时,json_value会直接返回JSONB类型的值,保留JSON原生的布尔格式true。此时转成text时,会输出JSON的原生字符串表示,也就是'true'。
你可以通过查看返回类型验证这一点:
-- 返回 boolean 类型 select pg_typeof(json_value(jsonb '[true]','$[0]')); -- 返回 jsonb 类型 select pg_typeof(json_value(jsonb '[true]','$[0]' returning jsonb));
简单来说,returning子句是用来指定json_value的返回类型的——要么转成SQL类型,要么保留JSON类型,两种场景的文本输出自然不同,完全符合设计预期。
内容的提问来源于stack exchange,提问作者Christian Beikov
相关产品推荐
相关产品推荐

