PostgreSQL中保留结构提取JSONB文档部分内容的方法
解决PostgreSQL JSONB仅保留指定键的问题
嘿,我懂你刚接触PostgreSQL JSONB时的这种困惑——提取内容还得保留结构确实容易踩小坑。你之前的思路方向是对的,只是差了一点点类型匹配的细节:
问题根源
你第一次用content -> 'fr' as content,这个操作符本来就只会提取fr对应的值,不会保留外层的键名,所以结果里自然看不到fr;而你用json_build_object时,它返回的是json类型,但你的content字段是jsonb类型,类型不匹配可能导致结果不符合预期。
正确解法
直接用PostgreSQL专门为JSONB设计的jsonb_build_object函数,它会返回jsonb类型,完美匹配你的字段类型:
SELECT id, status, jsonb_build_object('fr', content -> 'fr') AS content FROM posts;
如果坚持想用json_build_object,只需要把结果转成jsonb类型也能达到效果:
SELECT id, status, json_build_object('fr', content -> 'fr')::jsonb AS content FROM posts;
效果验证
假设你的content字段原本是:
{"fr": {"title": "Bonjour le monde"}, "en": {"title": "Hello World"}, "es": {"title": "Hola Mundo"}}
执行上面的SQL后,返回的content字段就会是:
{"fr": {"title": "Bonjour le monde"}}
完全符合你想要的结构。
内容的提问来源于stack exchange,提问作者maxim darré
相关产品推荐
相关产品推荐

