PostgreSQL按行拆分逗号分隔id列并计算均摊价格的实现方法
解决方案
完全可以用PostgreSQL原生SQL实现,不需要额外安装扩展,对入门学习者非常友好,核心依赖三个内置函数即可完成需求。
核心函数说明
string_to_array(待拆分字符串, 分隔符):将逗号分隔的id字符串转换为数组格式unnest(数组):将数组的每个元素拆分为独立的行array_length(数组, 维度):计算数组的元素数量,即当前行拆分得到的id总数
完整查询代码
SELECT -- 拆分id并去除前后多余空格 TRIM(unnest(string_to_array(id, ','))) AS new_id, -- 原价格除以id数量得到平分后的价格 price / array_length(string_to_array(id, ','), 1) AS new_price FROM my_ids_table;
逻辑说明
- 以第一行数据
id = 'id_01, id_02'、price = 100为例:string_to_array(id, ',')会得到数组['id_01', ' id_02']unnest()会把数组拆为2行,分别对应两个id值TRIM()清除拆分后id前后的多余空格,得到id_01、id_02array_length()计算得到数组长度为2,100/2得到new_price为50
- 其余行逻辑一致,拆分3个id的行就会把price平分为3份,最终输出结果完全符合预期。
可选优化:如果需要对平分后的价格保留固定小数位,可以在外层套
ROUND()函数,比如ROUND(price / array_length(string_to_array(id, ','), 1), 2) AS new_price即可保留两位小数。
内容的提问来源于stack exchange,提问作者eduardosteps
相关产品推荐
相关产品推荐

