0
点赞
收藏
分享

微信扫一扫

PgSQL生成随机的姓名的函数

大南瓜鸭 2022-01-26 阅读 90

用于为测试库生成随机的姓名。

生成的姓名基本能看,且一般能一眼看出不是正常的姓名,主要用于在系统测试时灌入测试数据,或用于覆盖现场正式数据为测试数据。

可以避免发生张飞、赵云、李世民在你的系统里出现的情况。

CREATE OR REPLACE FUNCTION get_random_name() 
RETURNS VARCHAR 
AS $BODY$
  /*姓的随机范围,仅保留百家姓的49个*/
  DECLARE rand_surname VARCHAR;
  /*名的随机范围*/
  DECLARE rand_name VARCHAR;
  /*随机生成姓名的长度,2到4个字*/
  DECLARE name_len INT;
BEGIN
  -- 功能:用于为测试库生成随机的姓名。生成的姓名基本能看,且一般能一眼看出不是正常的姓名,主要用于在系统测试时灌入测试数
  --      据,或用于覆盖现场正式数据为测试数据
  -- PS:rand_surname和rand_name可根据情况自行调整
  --     本存储过程依赖我的另一个函数my_random_num(),或自行调整为被注释掉的[返回姓名]处的脚本。
  -- 调用Demo:SELECT get_random_name();
  -- 本存储过程在PgSQL 14.1 中调试通过

  -- 姓的随机范围
  rand_surname:='赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦许何吕张孔曹严华金魏陶姜谢邹章云苏潘葛范彭马方袁柳史唐薛汤殷罗';
  -- 名的随机范围
  rand_name:= '丹举义之乐书乾云亦从代以伟佑俊修健傲儿元光兰冬冰冷凌凝凡凯初力勤千卉半华南博又友同向君听和哲嘉国坚城夏夜天奇奥如妙子存季孤宇安宛宸寒寻尔尧山岚峻巧平幼康建开弘强彤彦彬彭心忆志念怀怜恨惜慕成擎敏文新旋旭昊明易昕映春昱晋晓晗晟景晴智曼朋朗杰松枫柏柔柳格桃梦楷槐正水沛波泽洁洋济浦浩海涛润涵渊源溥濮瀚灵灿炎烟烨然煊煜熙熠玉珊珍理琪琴瑜瑞瑶瑾璞痴皓盼真睿碧磊祥祺秉程立竹笑紫绍经绿群翠翰致航良芙芷苍苑若茂荣莲菡菱萱蓉蓝蕊蕾薇蝶觅访诚语谷豪赋超越轩辉达远邃醉金鑫锦问雁雅雨雪霖霜露青靖静风飞香驰骞高鸿鹏鹤黎';

  -- PgSQL中,length(rand_surname)=字符数 ,中文字符占用1个长度
  -- 输出调试信息
  -- RAISE NOTICE 'rand_surname.length=[%]', length(rand_surname);
  -- RAISE NOTICE 'test name1=[%]', substr(rand_surname, 49, 1);
  -- 超出范围取不到字,但不报错
  -- RAISE NOTICE 'test name2=[%]', substr(rand_surname, 50, 1);
  -- RAISE NOTICE 'test name3=[%]', substr(rand_surname, 51, 1);

/*  -- 返回姓名    姓的第一个字
  RETURN concat(substr(rand_surname, floor(random()*length(rand_surname)+1)::INT, 1), 
           -- 复姓
           substr(rand_surname, floor(random()*length(rand_surname)+1)::INT, 1), 
           -- 名的第一个字
           substr(rand_name, floor(random()*length(rand_name)+1)::INT, 1), 
           -- 名的第二个字
           substr(rand_name, floor(random()*length(rand_name)+1)::INT, 1)
              );
*/
  -- 随机生成姓名的字数,2到4个字
  name_len := my_random_num(2, 4);
  IF name_len = 2 THEN
    -- 两个字的姓名
    RETURN concat(substr(rand_surname, my_random_num(1, length(rand_surname)), 1), 
             substr(rand_surname, my_random_num(1, length(rand_surname)), 1), 
             substr(rand_name, my_random_num(1, length(rand_surname)), 1)
             );
  ELSEIF name_len = 3 THEN
    -- 三个字的姓名
    RETURN concat(substr(rand_surname, my_random_num(1, length(rand_surname)), 1), 
             substr(rand_surname, my_random_num(1, length(rand_surname)), 1), 
             substr(rand_name, my_random_num(1, length(rand_surname)), 1)
             );
  ELSE
    -- 返回姓名  姓的第一个字
    RETURN concat(substr(rand_surname, my_random_num(1, length(rand_surname)), 1), 
             -- 复姓
             substr(rand_surname, my_random_num(1, length(rand_surname)), 1), 
             -- 名的第一个字
             substr(rand_name, my_random_num(1, length(rand_surname)), 1), 
             -- 名的第二个字
             substr(rand_name, my_random_num(1, length(rand_surname)), 1)
                );
  END IF;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1
举报

相关推荐

0 条评论