MSSQL的STR函数在PostgreSQL中的等效实现是什么?
PostgreSQL 中等效 MSSQL STR 函数的实现方案
MSSQL 中 STR 函数的核心逻辑如下:
- 接收3个参数:数值、总长度(默认值10)、小数精度(默认值0),总长度包含整数位、小数点、小数位、符号位以及左侧填充的空格
- 数值先按指定小数精度四舍五入,总长度小于指定值时左侧补空格实现右对齐
- 四舍五入后的数值总长度超过指定值时,返回对应长度的
*字符串
原生函数组合实现
无需自定义函数的场景下,可以用ROUND+TO_CHAR+LPAD/RPAD的组合直接实现对应效果:
- 对应MSSQL
SELECT STR(123.45, 6, 1)的查询:
SELECT LPAD(TRIM(TO_CHAR(ROUND(123.45, 1), '9999999999D9999999999')), 6, ' ');
返回结果为 123.5,和MSSQL运行结果完全一致。
- 对应MSSQL
SELECT STR(123.45, 2, 2)的查询:
SELECT CASE WHEN LENGTH(TRIM(TO_CHAR(ROUND(123.45, 2), '9999999999D9999999999'))) > 2 THEN RPAD('*', 2, '*') ELSE LPAD(TRIM(TO_CHAR(ROUND(123.45, 2), '9999999999D9999999999')), 2, ' ') END;
返回结果为**,完全对齐MSSQL的溢出返回逻辑。
封装自定义函数(推荐)
可以直接封装为和MSSQL同名的STR函数,参数规则和返回结果完全对齐,调用更便捷:
CREATE OR REPLACE FUNCTION STR(p_num numeric, p_len integer DEFAULT 10, p_dec integer DEFAULT 0) RETURNS text AS $$ DECLARE v_rounded numeric; v_str text; BEGIN -- 按指定小数精度四舍五入 v_rounded := ROUND(p_num, p_dec); -- 转换为无多余前导空格的字符串 v_str := TRIM(TO_CHAR(v_rounded, '9999999999D9999999999')); -- 长度溢出时返回对应长度的* IF LENGTH(v_str) > p_len THEN RETURN RPAD('*', p_len, '*'); END IF; -- 长度不足时左补空格实现右对齐 RETURN LPAD(v_str, p_len, ' '); END; $$ LANGUAGE plpgsql IMMUTABLE;
封装完成后即可直接调用:
-- 测试1 返回' 123.5' SELECT STR(123.45,6,1); -- 测试2 返回'**' SELECT STR(123.45,2,2); -- 缺省参数测试,总长度默认10、小数精度默认0,返回' 123' SELECT STR(123.45);
内容的提问来源于stack exchange,提问作者Mircea
相关产品推荐
相关产品推荐

