pgsql随机生成中文姓名

文章描述了一个在PostgreSQL中创建的名为get_random_name的函数,该函数用于生成随机的中文姓名,适用于填充测试数据。函数根据输入的性别参数(随机、男性或女性)从预定义的常见姓氏和名字列表中选择,生成2到4个字的姓名。
摘要由CSDN通过智能技术生成
-- FUNCTION: get_random_name(smallint)

-- DROP FUNCTION IF EXISTS get_random_name(smallint);

CREATE OR REPLACE FUNCTION get_random_name(
    _isex smallint DEFAULT '-1'::integer)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
AS $BODY$
  /*姓的随机范围,全国人数最多的前100个姓*/
  DECLARE rand_surName VARCHAR;
  /*名的随机范围*/
  DECLARE rand_girlName VARCHAR;
  DECLARE rand_boyName VARCHAR;
  /*随机生成姓名的长度,2到4个字*/
  DECLARE name_len INT;
  DECLARE _randomNumber INT;
  /* 准备返回的姓名 */
  DECLARE _ResultName VARCHAR;
BEGIN
  -- 功能:用于为测试库生成随机的姓名。生成的姓名基本能看,且一般能一眼看出不是正常的姓名,主要用于在系统测试时灌入测试数
  --      据,或用于覆盖现场正式数据为测试数据
  -- PS:rand_surName和rand_girlName、rand_boyName可根据情况自行调整
  --     本存储过程依赖我的另一个函数random_int(_begin_number int, _end_number int),或自行调整为随机数生成的写法。
  -- 调用Demo:SELECT get_random_name();
  -- 参数:
  --      _iSex,性别,-1=随机生成;1=男,2=女,可根据该值生成侧重于男性的姓名或女性的姓名
  -- 本存储过程在PgSQL 14.1 中调试通过
 
  -- 如果不传性别,则随机生成
  IF _iSex = -1 THEN
      --FLOOR(start_num + random() * (end_num - start_num + 1));
    _iSex = FLOOR(1 + random() * 2);
  END IF;
  -- 输出性别
  RAISE NOTICE '性别=[%]', _iSex;
  
  -- 姓的随机范围
  rand_surName := '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦许何吕张孔曹严华金魏陶姜谢邹章云苏潘葛范彭马方袁柳史唐薛汤殷罗';
  -- 姓的随机范围(之前是百家姓,现调整为全国人数量多的前100个姓)
  rand_surName := '李王张刘陈杨赵黄周吴徐孙胡朱高林何郭马罗梁宋郑谢韩唐冯于董萧程曹袁邓许傅沈曾彭吕苏卢蒋蔡贾丁魏薛叶阎余潘杜戴夏钟汪田任姜范方石姚谭廖邹熊金陆郝孔白崔康毛邱秦江史顾侯邵孟龙万段漕钱汤尹黎易常武乔贺赖龚文';
 
  -- 名的随机范围
  rand_girlName := '秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳嘉琼勤珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽';
  rand_boyName := '伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发武新利清飞彬富顺信子杰涛昌成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘';
 
  -- PgSQL中,length(rand_surName)=字符数 ,中文字符占用1个长度
  -- 输出调试信息
  -- RAISE NOTICE 'rand_surName.length=[%]', length(rand_surName);
  -- RAISE NOTICE 'test name1=[%]', substr(rand_surName, 100, 1);
  -- 超出范围取不到字,但不报错
  -- RAISE NOTICE 'test name2=[%]', substr(rand_surName, 101, 1);
  -- RAISE NOTICE 'test name3=[%]', substr(rand_surName, 102, 1);
 
  -- 随机生成姓名的字数,2到4个字
  name_len := FLOOR(2 + random() * 3);
  
  RAISE NOTICE 'len[%]', trunc(random() * length(rand_surName) + 1);
  
  -- 姓 begin
  _randomNumber = trunc(random() * length(rand_surName) + 1);
  _ResultName = substr(rand_surName, _randomNumber, 1);
  RAISE NOTICE 'name[%]', _ResultName;
  -- 若返回姓名是3个字或4个字的情况,需要给姓再加一个字,暂不考虑复姓
  IF (name_len = 3) OR (name_len = 4) THEN
      _randomNumber = trunc(random() * length(rand_surName) + 1);
    _ResultName = concat(_ResultName, substr(rand_surName, _randomNumber, 1));
  END IF;
  -- 姓 end
  
  -- 名 begin
  -- 男生
  IF _iSex = 1 THEN
      _randomNumber = trunc(random() * length(rand_boyName) + 1);
    _ResultName = concat(_ResultName, substr(rand_boyName, _randomNumber, 1));
  ELSE -- 女生
      _randomNumber = trunc(random() * length(rand_girlName) + 1);
    _ResultName = concat(_ResultName, substr(rand_girlName, _randomNumber, 1));
  END IF;
  
  -- 返回姓名字数为4的,名需要再加一个字
  IF name_len = 4 THEN
    -- 男生
    IF _iSex=1 THEN
      _randomNumber = trunc(random() * length(rand_boyName) + 1);
      _ResultName = concat(_ResultName, substr(rand_boyName, _randomNumber, 1));
    ELSE -- 女生
      _randomNumber = trunc(random() * length(rand_girlName) + 1);
      _ResultName = concat(_ResultName, substr(rand_girlName, _randomNumber, 1));
    END IF;
  END IF;
  -- 名 end
  
  RETURN _ResultName;
 
END;
$BODY$;

ALTER FUNCTION imis_uas.get_random_name(smallint)
    OWNER TO postgres;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值