设为首页
加入收藏夹

SQL Server中检索语句中Like的算法实现
浏览选项:

nbsp;   if(nPattPos == nPatternLen)

                     return nTextPos - nPattPos;

              else

                     return -1;

       }

}

 

////////////////////////////////////////////////////////////////////////////////

//     函数名称:bool _strlike(

//                          char * chText,

//                          char * chPattern,

//                          int nbegpos )

//     实现功能:两个字符串的匹配算法,带通配符

//     对全局变量的影响:无

//     参数说明:

//            chText                            原字符串

//            chPattern               模式串

//            nbegpos                       起始位置

//     返回结果说明:

//            =true       表示相似或一致

//            =false       表示不相似或不一致

////////////////////////////////////////////////////////////////////////////////

 

bool _strlike(char * chText , char * chPattern , int nbegpos /* = 0 */)

{

       bool bLeftMatch = true , bLast = false;

       int nTextLen = _tcslen(chText);

       //作最基础的匹配,即存在模式串的情况下再作比较

       if(_tcslen(chPattern) == 0)

              if(_tcslen(chText) == 0)

                     return true;

              else

                     return false;

       do

       {

              char * chFirstPattern , * chSecondPattern;

              if(chPattern[0] == '%')

              {

                     do

                     {

                            chPattern ++;

                     }while(chPattern[0] == '%');

                     if(chPattern == NULL || _tcslen(chPattern) == 0)

                            return true;

                     bLeftMatch = false;

              }

              else

                     bLeftMatch = true;

              //初始化模式串

              chSecondPattern = _tcschr(chPattern , '%');

 

              int nPatternLen;

              if(chSecondPattern == NULL)

              {

                     bLast = true;

                     nPatternLen = _tcslen(chPattern);

                     if(!bLeftMatch)

                     {

                            //若以%开头,并且没有剩余模式串时,只要考虑右对齐匹配的方式即可(实际上也是左对齐)

                            if(nbegpos + nPatternLen <= nTextLen)

                            {

                                   nbegpos = nTextLen - nPatternLen;

                                   bLeftMatch = true;

                            }

                            else

                                   return false;

                     }

                     else

                            if(nbegpos + nPatternLen != nTextLen)

                                   return false;

                    

              }

              else

              {

                     //模式串不得长于原串

                     nPatternLen = chSecondPattern - chPattern;

                     if(nbegpos + nPatternLen > nTextLen)

                            return false;

              }

 

              //初始化模式串与修改剩余串

              chFirstPattern = new char[nPatternLen + 1];

              memcpy(chFirstPattern , chPattern , nPatternLen);

              chFirstPattern[nPatternLen] = 0;

              chPattern = chSecondPattern;

 

              int npos = _strat(chText , chFirstPattern , nbegpos , bLeftMatch ? nPatternLen : nTextLen - nbegpos , bLeftMatch);

              delete chFirstPattern;

              if(npos < 0)

              {

                     return false;

              }

              else

              {

                     //定下一查找位置的起点

                     if(bLeftMatch)

                     {

                            if(npos != nbegpos)

                                   return false;

                     }

                     else

                            nbegpos = npos;

                     if(bLast)

                     {

             &nb

[首页]    [上一页]    [下一页]    [末页]    

Copyright © 2004 wanxu.com All Rights Reserved