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

PostgreSQL中如何将字符串前N位替换为*(示例:12345678转******78)

在PostgreSQL中替换字符串前N位为*的几种方法

嘿,这个需求其实用PostgreSQL的内置函数组合就能轻松实现,我给你分享几个实用的方案,从直接查询到封装函数都有:

一、直接拼接实现(针对你的示例)

如果只是想快速处理类似12345678保留后两位、替换前六位的场景,用repeat()、substring()和concat()的组合就很直观:

-- 替换前6位为*,保留最后2位
SELECT concat(
  repeat('*', length('12345678') - 2),  -- 生成对应数量的*
  substring('12345678' from length('12345678') - 1)  -- 截取最后两位
);

执行后就会得到******78,完全符合你的要求。

二、通用封装函数(复用性更强)

如果需要多次调用,或者要处理不同长度的字符串,甚至要兼容字符串长度比保留位数短的情况,封装成自定义函数会更方便:

CREATE OR REPLACE FUNCTION mask_prefix(str text, keep_length int)
RETURNS text AS $$
BEGIN
  -- 处理空值或非法保留长度的情况
  IF str IS NULL OR keep_length < 0 THEN
    RETURN str;
  END IF;
  
  RETURN concat(
    -- 生成对应数量的*,如果字符串长度小于保留位数,就生成0个*
    repeat('*', greatest(length(str) - keep_length, 0)),
    -- 截取需要保留的部分,避免起始位置小于1导致报错
    substring(str from greatest(length(str) - keep_length + 1, 1))
  );
END;
$$ LANGUAGE plpgsql IMMUTABLE;

调用示例:

SELECT mask_prefix('12345678', 2);  -- 返回 ******78
SELECT mask_prefix('12', 2);       -- 返回 12(原字符串长度等于保留位数,不替换)
SELECT mask_prefix('1', 2);        -- 返回 1(原字符串长度小于保留位数,不替换)
SELECT mask_prefix(NULL, 2);       -- 返回 NULL(处理空值)

三、用overlay()函数直接替换

PostgreSQL的overlay()函数可以直接替换字符串的指定部分,写法更简洁:

SELECT overlay('12345678' 
  placing repeat('*', length('12345678') - 2) 
  from 1 
  for length('12345678') - 2
);

这里placing后面是要替换的内容(6个*),from 1表示从第1位开始,for 6表示替换6个字符,最终效果和第一种方法一致。

小提示

如果你的字段可能包含空字符串或NULL,记得在查询里加上COALESCE做兼容,比如:

SELECT concat(
  repeat('*', length(COALESCE(your_column, '')) - 2),
  substring(COALESCE(your_column, '') from length(COALESCE(your_column, '')) - 1)
) FROM your_table;

内容的提问来源于stack exchange,提问作者Mayur Patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:53