如何用PSQL从嵌套JSON数组中提取最大宽度的衬衫名称
PostgreSQL嵌套JSON提取宽度最大的衬衫名称解决方案
针对warehouse表warehouse_data列中的嵌套JSON数据,要提取宽度最大的衬衫名称,可通过以下SQL实现:
方法一:排序取第一条(简洁高效)
SELECT (elem #> '{names,0,name}')::text AS shirt_name FROM warehouse, jsonb_array_elements(warehouse_data #> '{wardrobe,apparel,variety}') AS elem WHERE id = 1 ORDER BY (elem #> '{data,shirt,size,width}')::integer DESC LIMIT 1;
方法二:匹配最大宽度值(支持多结果场景)
如果存在多个宽度相同且为最大值的衬衫,此方法可返回所有符合条件的名称:
SELECT (elem #> '{names,0,name}')::text AS shirt_name FROM ( SELECT elem, (elem #> '{data,shirt,size,width}')::integer AS width FROM warehouse, jsonb_array_elements(warehouse_data #> '{wardrobe,apparel,variety}') AS elem WHERE id = 1 ) AS shirt_sizes WHERE width = ( SELECT MAX((elem #> '{data,shirt,size,width}')::integer) FROM warehouse, jsonb_array_elements(warehouse_data #> '{wardrobe,apparel,variety}') AS elem WHERE id = 1 );
关键步骤说明
jsonb_array_elements(warehouse_data #> '{wardrobe,apparel,variety}') AS elem:将wardrobe.apparel.variety下的JSON数组展开为独立行,每个行对应一个衬衫条目。elem #> '{data,shirt,size,width}'::integer:从每个条目提取宽度值并转为整数,用于排序和比较。elem #> '{names,0,name}':提取每个条目names数组中第一个元素的名称(当前JSON结构中每个条目names数组仅含一个元素)。
原SQL问题说明
你之前的语句仅提取了names数组,未关联对应的宽度信息,也未做筛选排序,因此无法定位到宽度最大的衬衫名称。
内容的提问来源于stack exchange,提问作者MB360
相关产品推荐
相关产品推荐

