PostgreSQL如何按合约动态指定小数位数执行ROUND运算?
动态按合约小数位数ROUND字段的实现方案
当然可行,你只需要通过表关联绑定两张表的对应字段,就能用contracts表中定义的rounding值作为ROUND函数的动态参数。
核心实现思路
通过idcontract字段关联trading.data18和contracts表,将合约对应的rounding值传入ROUND函数,替代原静态查询中的固定数字。注意:ROUND函数的第二个参数要求是整数,因此需要把contracts表中double类型的rounding字段转成整数类型。
示例SQL代码
仅返回有对应合约配置的记录(INNER JOIN)
SELECT d.idcontract, ROUND(CAST(d.close AS numeric), CAST(c.rounding AS integer)) AS rounded_close FROM trading.data18 d INNER JOIN contracts c ON d.idcontract = c.idcontract LIMIT 10;
保留所有交易记录,无合约配置时用默认小数位(LEFT JOIN)
如果需要保留trading.data18中所有数据,哪怕对应合约没有配置rounding,可以用COALESCE设置默认值(示例默认保留2位小数):
SELECT d.idcontract, ROUND(CAST(d.close AS numeric), COALESCE(CAST(c.rounding AS integer), 2)) AS rounded_close FROM trading.data18 d LEFT JOIN contracts c ON d.idcontract = c.idcontract LIMIT 10;
关键细节说明
CAST(c.rounding AS integer):解决ROUND参数类型要求,将double类型的小数位配置转为整数COALESCE:处理LEFT JOIN时可能出现的NULL值,确保无配置时查询不会报错
内容的提问来源于stack exchange,提问作者matel
相关产品推荐
相关产品推荐

