MySQL拼音首字母查询

实现过程如下:

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

DROP FUNCTION IF EXISTS `GET_FIRST_PINYIN_CHAR`;
CREATE FUNCTION `GET_FIRST_PINYIN_CHAR`(PARAM VARCHAR(255)) RETURNS VARCHAR(2) CHARSET utf8
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');
	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 

扫描二维码关注公众号,回复: 2404381 查看本文章

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

3.使用样例:

select symptom,get_first_pinyin_char(symptom) from bodySymptom where get_first_pinyin_char(symptom) = 'W'

显示结果:

已上为转载内容

从使用样例上来看,我们最终会传入一个字符的参数。所以我们要把前台传的参数转换成拼音。

首先引入java的拼音操作包pinyin4j,maven地址

<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.0</version>
</dependency>

为了使用方便,我们创建一个拼音工具类

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author: liuxing
 * @description:
 * @projectName: PinyinDome
 * @date: 2018-07-24
 * @time: 11:29
 */
public class PinyinUtils {
    /**
     * 汉字转换位汉语拼音首字母,英文字符转化为首字母大写
     * @param a
     * @return
     */
    public static String getFirst(String a){
        String pinyinName = "";
        if (StringUtils.isNotBlank(a)){
            if (isChinese(a)){
                //是汉字
                char[] nameChar = a.toCharArray();
               HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
                defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
                defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
                for (int i = 0; i < nameChar.length; i++) {
                        try {
                            pinyinName += PinyinHelper.toHanyuPinyinStringArray(
                                    nameChar[i], defaultFormat)[0].charAt(0);
                        } catch (BadHanyuPinyinOutputFormatCombination e) {
                            e.printStackTrace();
                            return null;
                        }
                }
                return pinyinName;
            }else if (isEnglish(a)){
                //不是汉字
                if (a.length()>=1){
                    pinyinName = a.substring(0,1).toUpperCase();
                    return pinyinName;
                }
            }else {
                return "火星文";
            }
        }
        return null;
    }
//检验是不是中文
    private static boolean isChinese(String str) {
        String regEx = "[\u4e00-\u9fa5]";
        Pattern pat = Pattern.compile(regEx);
        Matcher matcher = pat.matcher(str);
        boolean flg = false;
        if (matcher.find())
            flg = true;

        return flg;
    }
   //检验是不是英文
    private static boolean isEnglish(String str) {
        String regEx = "[A-Za-z]";
        Pattern pat = Pattern.compile(regEx);
        Matcher matcher = pat.matcher(str);
        boolean flg = false;
        if (matcher.find())
            flg = true;

        return flg;
    }
}

通过工具类就可以取到输入的第一个字的拼音首字母了

猜你喜欢

转载自blog.csdn.net/weixin_40760196/article/details/81178301