Odoo中文网|Odoo实施培训

 找回密码
 立即注册
搜索
热搜: Odoo OpenERP 实施
查看: 7279|回复: 1
打印 上一主题 下一主题

PostgreSQL获取汉字拼音首字母函数

[复制链接]

11

主题

21

帖子

73

积分

版主

Rank: 7Rank: 7Rank: 7

积分
73
跳转到指定楼层
楼主
发表于 2015-11-3 21:09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. CREATE OR REPLACE FUNCTION CnFirstChar(s character varying)  
  2.   RETURNS character varying AS  
  3. $BODY$  
  4. declare  
  5.   retval character varying;  
  6.   c character varying;  
  7.   l integer;  
  8.   b bytea;   
  9.   w integer;  
  10. begin  
  11. l=length(s);  
  12. retval='';  
  13. while l>0 loop  
  14.   c=left(s,1);  
  15.   b=convert_to(c,'GB18030')::bytea;  
  16.   if get_byte(b,0)<127 then  
  17.     retval=retval || upper(c);  
  18.   elsif length(b)=2 then  
  19.     begin  
  20.     w=get_byte(b,0)*256+get_byte(b,1);  
  21.     --汉字GBK编码按拼音排序,按字符数来查找,基于概率来说,效率应该比挨个强:)  
  22.     if w between 48119 and 49061 then --"J";48119;49061;942  
  23.       retval=retval || 'J';  
  24.     elsif w between 54481 and 55289 then --"Z";54481;55289;808  
  25.       retval=retval || 'Z';  
  26.     elsif w between 53689 and 54480 then --"Y";53689;54480;791  
  27.       retval=retval || 'Y';  
  28.     elsif w between 51446 and 52208 then --"S";51446;52208;762  
  29.       retval=retval || 'S';  
  30.     elsif w between 52980 and 53640 then --"X";52980;53640;660  
  31.       retval=retval || 'X';  
  32.     elsif w between 49324 and 49895 then --"L";49324;49895;571  
  33.       retval=retval || 'L';  
  34.     elsif w between 45761 and 46317 then --"C";45761;46317;556  
  35.       retval=retval || 'C';  
  36.     elsif w between 45253 and 45760 then --"B";45253;45760;507  
  37.       retval=retval || 'B';  
  38.     elsif w between 46318 and 46825 then --"D";46318;46825;507  
  39.       retval=retval || 'D';  
  40.     elsif w between 47614 and 48118 then --"H";47614;48118;504  
  41.       retval=retval || 'H';  
  42.     elsif w between 50906 and 51386 then --"Q";50906;51386;480  
  43.       retval=retval || 'Q';  
  44.     elsif w between 52218 and 52697 then --"T";52218;52697;479  
  45.       retval=retval || 'T';  
  46.     elsif w between 49896 and 50370 then --"M";49896;50370;474  
  47.       retval=retval || 'M';  
  48.     elsif w between 47297 and 47613 then --"G";47297;47613;316  
  49.       retval=retval || 'G';  
  50.     elsif w between 47010 and 47296 then--"F";47010;47296;286  
  51.       retval=retval || 'F';  
  52.     elsif w between 50622 and 50905 then--"P";50622;50905;283  
  53.       retval=retval || 'P';  
  54.     elsif w between 52698 and 52979 then--"W";52698;52979;281  
  55.       retval=retval || 'W';  
  56.     elsif w between 49062 and 49323 then--"K";49062;49323;261  
  57.       retval=retval || 'K';  
  58.     elsif w between 50371 and 50613 then --"N";50371;50613;242  
  59.       retval=retval || 'N';  
  60.     elsif w between 46826 and 47009 then--"E";46826;47009;183  
  61.       retval=retval || 'E';  
  62.     elsif w between 51387 and 51445 then--"R";51387;51445;58  
  63.       retval=retval || 'R';  
  64.     elsif w between 45217 and 45252 then --"A";45217;45252;35  
  65.       retval=retval || 'A';  
  66.     elsif w between 50614 and 50621 then --"O";50614;50621;7  
  67.       retval=retval || 'O';  
  68.     end if;  
  69.     end;  
  70.   end if;  
  71.   s=substring(s,2,l-1);  
  72.   l=l-1;  
  73. end loop;  
  74. return retval;  
  75. end;  
  76. $BODY$  
  77.   LANGUAGE plpgsql IMMUTABLE;
复制代码
原文: http://blog.qdac.cc/?p=1281

回复

使用道具 举报

2

主题

8

帖子

28

积分

新手上路

Rank: 1

积分
28
沙发
发表于 2015-11-7 00:00:54 | 只看该作者
好多数字,没看明白
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|技术支持|开发手册|Odoo中文网-远鼎旗下odoo培训网站 ( 苏ICP备15039516号 )

GMT+8, 2024-5-3 08:36 , Processed in 0.013959 second(s), 14 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表