PostgreSQL 获取拼音首字母的函数 (可以获取所有中文字符)经典原创分享

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 经典原创获取汉子拼音首字母的函数,原先用在ORACLE中,最近迁移到Postgresql中,分享出来。关键工作量是拼音首字母和汉子的对应码表整理获取比较耗费工作量。数据库默认是UTF-8库,函数内部转码成GBK进行使用。
CREATE OR REPLACE FUNCTION "gis"."get_hzpycap"("v_str" varchar, "needhz" int4=0)
  RETURNS "pg_catalog"."varchar" AS $BODY$
DECLARE
  pos        INT4;
  hzlen      INT4;
  hz         VARCHAR (10);
  hzbm       INT4;
  hzpy       VARCHAR (10);
  py         VARCHAR (4000);
  hasspace   INT4;

   hzpybm_0 = 'xxx';
   hzpybm_1 = 'xxx';
   hzpybm_2 = 'xxx';
   ... 具体见附件

BEGIN
  hzlen = NVL (LENGTH (v_str), 0);
  hasspace = 0;

  FOR pos IN 1 .. hzlen
  LOOP
     hz = SUBSTR (v_str, pos, 1);
     hzbm = gis.bytea_to_int(convert_to(hz,'gbk'));

     IF hzbm BETWEEN 0 AND 127
     THEN
           hz = UPPER(hz);         --大写, 并只允许 0-9 和 A-Z 字符
           IF (hz >= '0' AND hz <= '9') OR (hz >='A' AND hz <= 'Z') THEN
                py = CONCAT(py, hz);
IF needHZ=1 THEN py = CONCAT(py, hz); END IF;
           END IF;
     ELSE
        BEGIN
           hzbm = hzbm - 32767;

           --少减1, 因为下面使用字符串定位, 起始基址为1
           CASE
              WHEN hzbm < 0
              THEN
                 hzpy = '';
              WHEN hzbm < 3500
              THEN
                 hzpy = SUBSTR (hzpybm_0, hzbm, 1);
              WHEN hzbm < 7000
              THEN
                 hzpy = SUBSTR (hzpybm_1, hzbm - 3500, 1);
              WHEN hzbm < 10500
              THEN
                 hzpy = SUBSTR (hzpybm_2, hzbm - 7000, 1);
              WHEN hzbm < 14000
              THEN
                 hzpy = SUBSTR (hzpybm_3, hzbm - 10500, 1);
              WHEN hzbm < 17500
              THEN
                 hzpy = SUBSTR (hzpybm_4, hzbm - 14000, 1);
              WHEN hzbm < 21000
              THEN
                 hzpy = SUBSTR (hzpybm_5, hzbm - 17500, 1);
              WHEN hzbm < 24500
              THEN
                 hzpy = SUBSTR (hzpybm_6, hzbm - 21000, 1);
              WHEN hzbm < 28000
              THEN
                 hzpy = SUBSTR (hzpybm_7, hzbm - 24500, 1);
              WHEN hzbm < 31500
              THEN
                 hzpy = SUBSTR (hzpybm_8, hzbm - 28000, 1);
              WHEN hzbm < 35000
              THEN
                 hzpy = SUBSTR (hzpybm_9, hzbm - 31500, 1);
              ELSE
                 hzpy = '';
           END CASE;

           IF hzpy <> ' ' THEN
               py = CONCAT(py, hzpy);
IF needHZ=1 THEN py = CONCAT(py, hz); END IF;
           END IF;
        END;
     END IF;
  END LOOP;

  RETURN py;
END;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE COST 100
;

ALTER FUNCTION "gis"."get_hzpycap"("v_str" varchar, "needhz" int4) OWNER TO "meter";
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
存储 SQL NoSQL
mysql存储过程和存储函数
mysql存储过程和存储函数
|
2月前
|
关系型数据库 MySQL Serverless
MYSQL数字函数:不可不知的数据处理利器
MYSQL数字函数是数据处理的得力助手,高效、准确且灵活。从基础数学运算到复杂数据转换,如ROUND、CEILING、FLOOR等,它们都能轻松胜任。ROUND函数实现数据四舍五入,而CEILING和FLOOR则分别进行向上和向下取整。这些函数不仅提升数据处理效率,还保障数据精确性和一致性。在数据分析、报表生成及业务逻辑处理中,MYSQL数字函数均扮演关键角色。对于数据处理开发者而言,熟练掌握这些函数是不可或缺的技能,它们将极大助力工作并提升职业竞争力。
64 0
|
2月前
|
关系型数据库 MySQL 索引
936. 【mysql】locate函数
936. 【mysql】locate函数
23 2
|
2月前
|
SQL 关系型数据库 MySQL
927. 【mysql】coalesce 函数
927. 【mysql】coalesce 函数
27 3
|
2月前
|
关系型数据库 MySQL
926.【mysql】 date 函数
926.【mysql】 date 函数
98 3
|
2月前
|
关系型数据库 MySQL
925. 【mysql】convert 函数
925. 【mysql】convert 函数
27 3
|
2月前
|
SQL 存储 关系型数据库
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
51 0
|
2天前
|
SQL 关系型数据库 MySQL
MySQL第三战:CRUD,函数1以及union&union all
MySQL第三战:CRUD,函数1以及union&union all
|
9天前
|
关系型数据库 MySQL Linux
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
【MySQL-10】数据库函数-案例演示【字符串/数值/日期/流程控制函数】(代码演示&可cv代码)
|
11天前
|
存储 关系型数据库 MySQL
MySQL 格式化日期函数 DATE_FORMAT(), FROM_UNIXTIME() 和 UNIX_TIMESTAMP() 之间区别
MySQL 格式化日期函数 DATE_FORMAT(), FROM_UNIXTIME() 和 UNIX_TIMESTAMP() 之间区别