zoukankan      html  css  js  c++  java
  • 近音搜索,比较输入Z就可以搜索到拼音Z开头的汉字,搜索"浙江",只要输入"ZJ"就可以了


    相关算法如下:
    有兴趣可以测试一下,希望能给你带来帮助
     using System;
     
    using System.Text;
     
    using System.IO;
     
    namespace ts{
     
    class test{
     
    private static string[] startChars = {"""""","","","","","","","","","","","","","",
                  
    "","""","","","","","","",""}
    ;
       
    private static string[] endChars = {"""""","","","","","","","","","","","","","",
                   
    "","""","","","","","","",""}
    ;
     
       
    /// <summary>
       
    /// 根据字符和对应的中文字符,转成SQL查询条件
       
    /// </summary>
       
    /// <param name="cChar">要转化的字符,[A-Z]</param>
       
    /// <param name="strFieldName">条件左值</param>
       
    /// <returns>SQL条件</returns>
       
    /// <remarks> Sxf 2001-1-4 ***** JY 2002-1-4 </remarks>

       public static string GetCharCondition(char cChar, string strFieldName)
       
    {
        
    string strWord;
        
    int Index = (int)(char.ToUpper(cChar)) - (int)'A';
        
    if (Index >= 0 && Index < 26)
         strWord 
    = startChars[Index];
        
    else
         strWord 
    = startChars[0];
        
    //            return string.Format("(({0}>='{1}' AND {0}<'[') OR ({0} >= '{3}' AND {0} < '{{') OR {0}>='{2}')", 
        
    //                strFieldName, char.ToUpper(cChar), strWord, char.ToLower(cChar));
        return string.Format("(({0} >= '{3}' AND {0} <= 'zzzzzzzz') OR {0}>='{2}')"
         strFieldName, 
    char.ToUpper(cChar), strWord, char.ToLower(cChar));
       }

     
             
    /// <summary>
             
    /// 将指定字段值的每个字符分割,这样可以生成同音查询的SQL
             
    /// </summary>
             
    /// <param name="fieldName">字段名</param>
             
    /// <param name="fieldValue">字段值</param>
             
    /// <returns>生成的可以进行同音查询的SQL</returns>

       public static string GetCharFullCondition(string fieldName, string fieldValue)
       
    {
        StringBuilder sql 
    = new StringBuilder(1024);
        
    int i = 1;
        
    foreach (char c in fieldValue)
        
    {
         
    if (i > 1)
          sql.Append(
    " AND ");
         
    int index = (int)(char.ToUpper(c)) - (int)'A';
         
    string startWord, endWord;
         
    if (index >= 0 && index < 26)
         
    {
          startWord 
    = startChars[index];
          endWord 
    = endChars[index];
         }

         
    else
         
    {
          startWord 
    = startChars[0];
          endWord 
    = endChars[0];
         }

         
    string subStr = String.Format("SUBSTRING({0}, {1}, {2})", fieldName, i, 1);
         sql.AppendFormat(
    "({0} BETWEEN '{1}' AND '{2}')", subStr, startWord, endWord);
         
    ++i;
        }

     
        
    return sql.ToString();
       }

     }

     }
     
    我这个是基于SqlServer2000中的自定义函数的,如下:

    Create function getPY(@str nvarchar(4000))
    returns nvarchar(4000)
    as
    begin
    declare @word nchar(1),@PY nvarchar(4000)
    set @PY=''
    while len(@str)>0
    begin
    set @word=left(@str,1)
    --如果非汉字字符,返回原字符
    set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
    then (select top 1 PY from (
    select 'A' as PY,N'驁' as word
    union all select 'B',N'簿'
    union all select 'C',N'錯'
    union all select 'D',N'鵽'
    union all select 'E',N'樲'
    union all select 'F',N'鰒'
    union all select 'G',N'腂'
    union all select 'H',N'夻'
    union all select 'J',N'攈'
    union all select 'K',N'穒'
    union all select 'L',N'鱳'
    union all select 'M',N'旀'
    union all select 'N',N'桛'
    union all select 'O',N'漚'
    union all select 'P',N'曝'
    union all select 'Q',N'囕'
    union all select 'R',N'鶸'
    union all select 'S',N'蜶'
    union all select 'T',N'籜'
    union all select 'W',N'鶩'
    union all select 'X',N'鑂'
    union all select 'Y',N'韻'
    union all select 'Z',N'咗'
    ) T
    where word>=@word collate Chinese_PRC_CS_AS_KS_WS
    order by PY ASC) else @word end)
    set @str=right(@str,len(@str)-1)
    end
    return @PY
    end

    调用方法是:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using Microsoft.ApplicationBlocks.Data;

    namespace Function
    {
    public class 生成助记码
    {
    /// <summary>
    /// 根据汉字获取拼音首码
    /// </summary>
    /// <param name="Chinese"></param>
    /// <returns></returns>
    public static string GetPY(string Chinese)
    {
    SqlParameter [] param = new SqlParameter[1];
    param[0] = new SqlParameter("@中文",Chinese);

    try
    {
    object objPingYing = SqlHelper.ExecuteScalar(数据连接字串,CommandType.Text,"select dbo.GetPY(@中文)",param);
    if (objPingYing==null)
    {
    return string.Empty;
    }
    else
    {
    return objPingYing.ToString();
    }
    }
    catch
    {
    return string.Empty;
    }
    }

    }

  • 相关阅读:
    oracle提交commit后回退恢复
    jQuery toggle() 方法 : 切换隐藏和显示
    sql server vs mysql
    Redis学习
    【转发】c#做端口转发程序支持正向连接和反向链接
    IKVM
    注册表
    解决VS2010自带的C/C++编译器CL找不到mspdb100.dll的问题
    【转载】Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info
    Openwrt路由器上开发微信公众号应用
  • 原文地址:https://www.cnblogs.com/luluping/p/1530523.html
Copyright © 2011-2022 走看看