MySQL拼音首字母查询


http://blog.csdn.net/tkw123/article/details/6715690

如果我们需要查询结果集中以A或者其它字母开头的汉语,实现方法如下,譬如,查询t_pvipuserinfo表中以字母B或者b开头的username 和以拼音中b(bo)开头的汉字姓名:
select * from t_pvipuserinfo where  CONV(HEX(left(CONVERT(usernameUSING gbk),1)),16,10) between 45253 and 45760 or username like 'b%' or usernamelike 'B%'
其中45253与45760分别为汉语拼音首字母以B开头的拼音编码的开始值与结束值。


http://www.2cto.com/database/201312/267224.html

自己增加了‘#’字段

1.创建一个获取中英文大写首字母函数:返回值为

CHARSET utf8
传进来的参数用gbk

CREATE DEFINER=`root`@`%` FUNCTION `GET_FIRST_PINYIN_CHAR`(`param` VARCHAR(255))
RETURNS varchar(2) CHARSET utf8
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE V_RETURN VARCHAR(255);
DECLARE V_FIRST_CHAR VARCHAR(2);
SET V_FIRST_CHAR = UPPER(LEFT(param,1));
SET V_RETURN = V_FIRST_CHAR;
IF LENGTH( V_FIRST_CHAR) <> CHARACTER_LENGTH( V_FIRST_CHAR ) THEN
SET V_RETURN = ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(param USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,
0xC8F6,0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1),
'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z');
ELSE
IF V_FIRST_CHAR < 'A' or V_FIRST_CHAR > 'Z' THEN
SET V_RETURN = '#';
END IF;
END IF;
RETURN V_RETURN;
END

2.使用的MySQL函数备注:

left(str,length):从左边开始截取字符串

upper(str):将字符串转为大写

length(str):计算字符串长度,一个汉字算三个字符,一个数字或字母算一个字符

character_length(str):汉字、数字、字母都算一个字符

convert(expr USING encode):不同字符集之间的数据转换

hex(Number or Str):将数字或字符串转换为十六进制

conv(Number, from, to):将数字从原来的进制转换成指定的进制

interval(N,N1,N2,N3,......):将N的值与后面的值列表进行比较。假如N < N1,则返回值为0;假如N < N2 等等,则返回值为1;假如N < N3 等等,则返回值为2;.....以此类推;假如N 为NULL,则返回值为 -1 。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 N1 < N2 < N3 < ……< Nn

elt(N,str1,str2,str3,...):若N = 1,则返回值为 str1,若N = 2,则返回值为 str2,以此类推。若N 小于1或大于参数的数目,则返回值为 NULL。



例子查询语句:

--------------------

--querySortWordByName

select get_first_pinyin_char(contacts_name) as py from crm_contacts g

where

contacts_deleteflag <> 'Y'

<#if contactName?? &&contactName != "">

          and g.contacts_name like :contactName

</#if>

      group by py


--------------------
--queryTodayContact
select * from crm_contact
    where
        deleteflag <> 'Y' and DateDiff(create_time,Now())=0
    order by
        update_time desc
<#if startRecord != -1 && perRecord != -1>
    limit :startRecord,:perRecord
</#if>    


查询包含关注人的联系人信息
--------------------
--getFollowContact
select *,get_first_pinyin_char(contact_name) as py from crm_contact g
left join crm_customer s on g.customer_id = s.customer_id    
where g.deleteflag <> 'Y'
and (exists (select 1 from crm_contact_follow fc where fc.contact_id = g.contact_id and fc.system_user_id = :userId))
<#if keyword?? && keyword != "">
and (g.contact_name like :keyword
    or g.contact_sex like :keyword
    or g.contact_email like :keyword
    or g.contact_mobile like :keyword
    or g.contact_qq like :keyword
    or g.contact_duties like :keyword
    or g.contact_address like :keyword
    or s.customer_name like :keyword)
</#if>
order by  py

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值