当前位置: 代码迷 >> Sql Server >> 关于模糊查询解决办法
  详细解决方案

关于模糊查询解决办法

热度:59   发布时间:2016-04-24 10:27:02.0
关于模糊查询
有一动态字符串,需要用到模糊查询,字符串中可能会存在两个相同或不同的地名,模糊查询需要根据第二个地名(靠近‘生产制造’)得到想要的结果;
例如:'上海aaaaa北京bbbbbb生产制造ccccc’              结果应为:BJ        

             ‘上海aaaaa上海bbbbbb生产制造ccccc’             结果应为:SH
 
             '天津aaaaa上海bbbbbb生产制造ccccc’             结果应为:SH


              
------解决方案--------------------
上海aaaaa北京bbbbbb生产制造ccccc 
中北京和生产制造 之间的字符长度是不是确定的?
------解决方案--------------------
DECLARE @Str NVARCHAR(200)=N'a上海aaadsaaa北京bbbbbb生产制造ccccc'
DECLARE @StrCn NVARCHAR(200)=N''
DECLARE @Next NVARCHAR(1)
DECLARE @FirstCnt INT=0

WHILE LEN(@Str)>0
BEGIN
SET @Next=LEFT(@Str,1)
IF UNICODE(@Next) BETWEEN 19968 AND 40869
SELECT @StrCn=@StrCn+@Next,@FirstCnt=0

SET  @Str=RIGHT(@Str,LEN(@Str)-1)
 
IF (UNICODE(LEFT(@Str,1)) < 19968 OR UNICODE(LEFT(@Str,1))>40869) AND @FirstCnt=0
SELECT @StrCn=@StrCn+',' ,@FirstCnt=@FirstCnt+1
END 

SELECT ROW_NUMBER() OVER(ORDER BY @@SERVERNAME) AS ID
,t.c.value('.','NVarchar(10)') AS col  from    
(SELECT CAST('<x>'+REPLACE(LEFT(@StrCn,LEN(@StrCn)-1),',','</x><x>')+'</x>' AS XML ).query('.') AS name) AS a  
CROSS APPLY a.name.nodes('/x') T(c)  
 写着玩的。看有没你想要的东西
------解决方案--------------------
还需要一个地名数据库吧,要不怎么判断是地名呢?
------解决方案--------------------
判断出来地名了,还需要自定义函数,获取汉字的首字母。
下面给你一个获取拼音首字母的脚本
--获取拼音首字母函数
create function f_GetPy(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @strlen int,@re nvarchar(4000)
declare @t table(chr nchar(1) collate Chinese_PRC_CI_AS,letter nchar(1))
insert into @t(chr,letter)
  select '吖','A' union all select '八','B' union all
  select '嚓','C' union all select '咑','D' union all
  select '妸','E' union all select '发','F' union all
  select '旮','G' union all select '铪','H' union all
  select '丌','J' union all select '咔','K' union all
  select '垃','L' union all select '嘸','M' union all
  select '拏','N' union all select '噢','O' union all
  select '妑','P' union all select '七','Q' union all
  select '呥','R' union all select '仨','S' union all
  select '他','T' union all select '屲','W' union all
  select '夕','X' union all select '丫','Y' union all
  select '帀','Z'
  select @strlen=len(@str),@re=''
  while @strlen>0
  begin
    select top 1 @re=letter+@re,@strlen=@strlen-1
      from @t a where chr<=substring(@str,@strlen,1)
      order by chr desc
    if @@rowcount=0
      select @re=substring(@str,@strlen,1)+@re,@strlen=@strlen-1
  end
  return(@re)
end
go
--调用
create table tb(col varchar(10))
insert into tb values('潇洒老乌龟')
insert into tb values('孤星')

go
select 按拼音首字母 = dbo.f_GetPy(col) from tb

drop table tb
drop function f_GetPy

/*
按拼音首字母
------------
XSLWG
GX

(2 行受影响)
*/

------解决方案--------------------
你这是一个表中一个列还是,传参是字符串?然后中间的字符是不确定的还是你自己定义的,可以换掉?
------解决方案--------------------
改表结构  分成3个字段怎么样   然后根据第二个字段查
------解决方案--------------------
例如:'上海aaaaa北京bbbbbb生产制造ccccc’              结果应为:BJ        

             ‘上海aaaaa上海bbbbbb生产制造ccccc’             结果应为:SH
 
             '天津aaaaa上海bbbbbb生产制造ccccc’             结果应为:SH


可以參考6樓的方法。對字符串內容建立關鍵字,如“天津aaaaa上海bbbbbb生产制造ccccc” ,可以建立"天津","上海"兩個關鍵字(也可以使用拼音作為關鍵字),然後再對關鍵字作為模糊搜索。

再深入一點,如果搜索靠近“生產製造”的地址,在上面关键字的基础上,增加一个关键字权重。这样就可以解决了楼主问题。
  相关解决方案