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
相关产品推荐
相关产品推荐

