You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSSQL的STR函数在PostgreSQL中的等效实现是什么?

PostgreSQL 中等效 MSSQL STR 函数的实现方案

MSSQL 中 STR 函数的核心逻辑如下:

  • 接收3个参数:数值、总长度(默认值10)、小数精度(默认值0),总长度包含整数位、小数点、小数位、符号位以及左侧填充的空格
  • 数值先按指定小数精度四舍五入,总长度小于指定值时左侧补空格实现右对齐
  • 四舍五入后的数值总长度超过指定值时,返回对应长度的*字符串

原生函数组合实现

无需自定义函数的场景下,可以用ROUND+TO_CHAR+LPAD/RPAD的组合直接实现对应效果:

  1. 对应MSSQLSELECT STR(123.45, 6, 1)的查询:
SELECT LPAD(TRIM(TO_CHAR(ROUND(123.45, 1), '9999999999D9999999999')), 6, ' ');

返回结果为 123.5,和MSSQL运行结果完全一致。

  1. 对应MSSQLSELECT 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:45:03