PostgreSQL中jsonb类型转换与to_jsonb函数的查询结果差异原因
两条PostgreSQL查询结果不同的原因分析
第一条语句的逻辑
select '{"items":["foo", "bar"]}'::jsonb->'items';
这条语句里的::jsonb是类型强制转换,PostgreSQL会直接解析这个符合JSON格式的字符串,将其转换成包含items键的JSON对象。之后用->'items'访问对象的items键,就能正确拿到对应的数组["foo", "bar"]。
第二条语句的逻辑
select to_jsonb('{"items":["foo", "bar"]}'::text)->'items';
这里是先把字符串转为text类型(其实::text可以省略,原字符串本身就是text类型),再通过to_jsonb()函数处理这个文本。to_jsonb()处理text类型的规则是:把整个文本当作JSON字符串值包装起来,转换后的jsonb实际是"{"items":["foo", "bar"]}"(外层多了引号,是一个字符串,而非JSON对象)。
当用->'items'去访问这个字符串的items键时,由于JSON字符串没有键值对结构,找不到对应的键,所以返回NULL,也就是你看到的[NULL]。
核心区别
::jsonb会直接解析JSON格式的字符串,生成对应的JSON对象/数组结构to_jsonb(text)仅把输入文本当作JSON的一个字符串值,不会解析文本内容的JSON结构
内容的提问来源于stack exchange,提问作者yucer
相关产品推荐
相关产品推荐

