zoukankan      html  css  js  c++  java
  • Oracle——根据拼音首字母模糊查询某个字段

    前言

    Oracle数据库模糊查询数据,可以用like关键字;

    但是,业务上有时候需要根据拼音首字母模糊查询某个字段,这时候考虑的点就比较多了

    问题解决

    解决方法有3种:

    1. 表中添加一个字段表示拼音首字母

    在表中增加一个字段,用于存储客户姓氏第一个字拼音的首字母。以后查询直接 name like  '%name%' 就OK了。 但是这样做的话不利于维护数据,而且业务上要求模糊查询的字段过多的话,需要添加更多的字段满足需求;

    2.利用gb2312编码

    利用gb2312的编码,比如以a开头的为 B0A1 到 B0C4 那么查询直接 select * from Table where substr(name,0,1) between 'B0A1' and 'B0C4'  就能直接把所需数据查询出来了。 不知此方法是否可行,因为现在数据库的编码是utf-8,不能适用

    3.利用oracle 函数,将传入的姓名转成所需的姓氏拼音首字母

    CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS   
    V_COMPARE VARCHAR2(100);   
    V_RETURN VARCHAR2(4000);   
      
    FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS   
    BEGIN   
    RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');   
    END;   
    BEGIN   
    FOR I IN 1..LENGTH(P_NAME) LOOP   
    V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));   
    IF V_COMPARE >= F_NLSSORT(' 吖 ') AND V_COMPARE <= F_NLSSORT('驁 ') THEN   
    V_RETURN := V_RETURN || 'a';   
    ELSIF V_COMPARE >= F_NLSSORT('八 ') AND V_COMPARE <= F_NLSSORT('簿 ') THEN   
    V_RETURN := V_RETURN || 'b';   
    ELSIF V_COMPARE >= F_NLSSORT('嚓 ') AND V_COMPARE <= F_NLSSORT('錯 ') THEN   
    V_RETURN := V_RETURN || 'c';   
    ELSIF V_COMPARE >= F_NLSSORT('咑 ') AND V_COMPARE <= F_NLSSORT('鵽 ') THEN   
    V_RETURN := V_RETURN || 'd';   
    ELSIF V_COMPARE >= F_NLSSORT('妸 ') AND V_COMPARE <= F_NLSSORT('樲 ') THEN   
    V_RETURN := V_RETURN || 'e';   
    ELSIF V_COMPARE >= F_NLSSORT('发 ') AND V_COMPARE <= F_NLSSORT('猤 ') THEN   
    V_RETURN := V_RETURN || 'f';   
    ELSIF V_COMPARE >= F_NLSSORT('旮 ') AND V_COMPARE <= F_NLSSORT('腂 ') THEN   
    V_RETURN := V_RETURN || 'g';   
    ELSIF V_COMPARE >= F_NLSSORT('妎 ') AND V_COMPARE <= F_NLSSORT('夻 ') THEN   
    V_RETURN := V_RETURN || 'h';   
    ELSIF V_COMPARE >= F_NLSSORT('丌 ') AND V_COMPARE <= F_NLSSORT('攈 ') THEN   
    V_RETURN := V_RETURN || 'j';   
    ELSIF V_COMPARE >= F_NLSSORT('咔 ') AND V_COMPARE <= F_NLSSORT('穒 ') THEN   
    V_RETURN := V_RETURN || 'k';   
    ELSIF V_COMPARE >= F_NLSSORT('垃 ') AND V_COMPARE <= F_NLSSORT('擽 ') THEN   
    V_RETURN := V_RETURN || 'l';   
    ELSIF V_COMPARE >= F_NLSSORT('嘸 ') AND V_COMPARE <= F_NLSSORT('椧 ') THEN   
    V_RETURN := V_RETURN || 'm';   
    ELSIF V_COMPARE >= F_NLSSORT('拏 ') AND V_COMPARE <= F_NLSSORT('瘧 ') THEN   
    V_RETURN := V_RETURN || 'n';   
    ELSIF V_COMPARE >= F_NLSSORT('筽 ') AND V_COMPARE <= F_NLSSORT('漚 ') THEN   
    V_RETURN := V_RETURN || 'o';   
    ELSIF V_COMPARE >= F_NLSSORT('妑 ') AND V_COMPARE <= F_NLSSORT('曝 ') THEN   
    V_RETURN := V_RETURN || 'p';   
    ELSIF V_COMPARE >= F_NLSSORT('七 ') AND V_COMPARE <= F_NLSSORT('裠 ') THEN   
    V_RETURN := V_RETURN || 'q';   
    ELSIF V_COMPARE >= F_NLSSORT('亽 ') AND V_COMPARE <= F_NLSSORT('鶸 ') THEN   
    V_RETURN := V_RETURN || 'r';   
    ELSIF V_COMPARE >= F_NLSSORT('仨 ') AND V_COMPARE <= F_NLSSORT('蜶 ') THEN   
    V_RETURN := V_RETURN || 's';   
    ELSIF V_COMPARE >= F_NLSSORT('侤 ') AND V_COMPARE <= F_NLSSORT('籜 ') THEN   
    V_RETURN := V_RETURN || 't';   
    ELSIF V_COMPARE >= F_NLSSORT('屲 ') AND V_COMPARE <= F_NLSSORT('鶩 ') THEN   
    V_RETURN := V_RETURN || 'w';   
    ELSIF V_COMPARE >= F_NLSSORT('夕 ') AND V_COMPARE <= F_NLSSORT('鑂 ') THEN   
    V_RETURN := V_RETURN || 'x';   
    ELSIF V_COMPARE >= F_NLSSORT('丫 ') AND V_COMPARE <= F_NLSSORT('韻 ') THEN   
    V_RETURN := V_RETURN || 'y';   
    ELSIF V_COMPARE >= F_NLSSORT('帀 ') AND V_COMPARE <= F_NLSSORT('咗 ') THEN   
    V_RETURN := V_RETURN || 'z';   
    END IF;   
    END LOOP;   
    RETURN V_RETURN;   
    END;

    使用该函数方式:

    可以先取出姓名,然后取汉字的首字母,即可用来作为查询条件

    select t.name from table_name t where f_trans_pinyin_capital(t.name) = 'ls';

    参考文献:

    [1].https://blog.csdn.net/wangheid/article/details/5288216

    [2].https://www.cnblogs.com/telwanggs/p/6855491.html

  • 相关阅读:
    struts.xml文件中package元素的各大属性讲解
    strus2 struts.xml详解
    既使用maven编译,又使用lib下的Jar包
    Maven项目同时使用lib下的Jar包
    PreparedStatement ResultSet
    SearchBySql
    java 生成GUID
    获取当前时间的字符串
    C#字符串比较
    浮点数比较大小
  • 原文地址:https://www.cnblogs.com/shuhao66666/p/15196325.html
Copyright © 2011-2022 走看看