请问这种查询算法怎么实现?

s_hluo 2012-02-13 11:38:53
数据库有个表叫MyTable, 里面有一列叫Mobile, 存储11位的手机号码。
现在MyTable里面存储了一批手机号码。

问题:举个例子,假如我输入3549,即将数据拆分成 3、5、4、9. 我如何能从MyTable中匹配包含3,5,4,9的手机号码(顺序不限,比如3,4,5,9或3,9,4,5等都一样)?

匹配结果类似:15934852491

...全文
219 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_hluo 2012-02-14
  • 打赏
  • 举报
回复
叶子, 我看你给的例子中, 假如有个数据是“生活中的程序员”就查不出来了吧?
baiynije 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 s_hluo 的回复:]
引用 4 楼 baiynije 的回复:
可不可以根據輸入的值來組SQL如:
mobile like '%3%' and mobile like '%4%' and mobile like '%5%' and mobile like '%9%'


如果我输入2344

那么15925673491,会被匹配出来,而实际上像15925643401才会被匹配出来,因为个数也要匹配正确。
[/Quote]
拆開數值後組SQL時可加判斷是否有重復值,如有重復值可組成如下:
mobile like '%2%' and mobile like '%3%' and mobile like '%4%4%'
s_hluo 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sz_haitao 的回复:]
顺序是否限制,重复是否要求

如果我输入2344
那么
15925673491 不该出来
15925643401 该出来
15956434201 也该出来?

可以先把每个号码按数字生成到1个从表b(fno号码,f9数字,fc次数):
每个不同的数字一条记录,同时填它的出现次数

然后。。。。。。。
[/Quote]

15925673491 不该出来
15925643401 该出来
15956434201 也该出来? -->对。 是要显示出来的。
haitao 2012-02-14
  • 打赏
  • 举报
回复
顺序是否限制,重复是否要求

如果我输入2344
那么
15925673491 不该出来
15925643401 该出来
15956434201 也该出来?

可以先把每个号码按数字生成到1个从表b(fno号码,f9数字,fc次数):
每个不同的数字一条记录,同时填它的出现次数

然后。。。。。。。

s_hluo 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 baiynije 的回复:]
可不可以根據輸入的值來組SQL如:
mobile like '%3%' and mobile like '%4%' and mobile like '%5%' and mobile like '%9%'
[/Quote]

如果我输入2344

那么15925673491,会被匹配出来,而实际上像15925643401才会被匹配出来,因为个数也要匹配正确。
  • 打赏
  • 举报
回复
先把你的字符串拆分成一个一个的,然后再去查询,where后的条件可以按照楼上的写法
baiynije 2012-02-14
  • 打赏
  • 举报
回复
可不可以根據輸入的值來組SQL如:
mobile like '%3%' and mobile like '%4%' and mobile like '%5%' and mobile like '%9%'
s_hluo 2012-02-14
  • 打赏
  • 举报
回复
多谢各位了。
zhangfeiay 2012-02-14
  • 打赏
  • 举报
回复
经过我的验证,这个是有用的。
其实叶子的方法就是:把传进去的程序生活变成了 程%序%生%活%


[Quote=引用 1 楼 maco_wang 的回复:]
SQL code


--创建函数

create function [dbo].[m_fuzzyquery_v1]

(

@str nvarchar(2000)

)

returns nvarchar(2000)

as

begin

declare @count int,@i int;

decla……
[/Quote]
叶子 2012-02-13
  • 打赏
  • 举报
回复
应该是按匹配度排序

1、看看每个数字是不是都在字段内,个数为n(0-4)
2、看看数字的顺序符合情况,个数为(0-4)
3、看看第一个符合要求的数字的位置。

然后综上所述写个匹配度排序。
叶子 2012-02-13
  • 打赏
  • 举报
回复

--创建函数

create function [dbo].[m_fuzzyquery_v1]

(

@str nvarchar(2000)

)

returns nvarchar(2000)

as

begin

declare @count int,@i int;

declare @newchar nvarchar(200),@nn nvarchar(300),@hh nvarchar(200)

set @count=len(@str);set @i=1;set @nn='';

while @i<@count+1

begin

set @newchar=substring(@str,@i,1)+'%'

set @nn=@nn+@newchar;

set @i=@i+1;

end

set @hh='%'+@nn

return @hh

end



--测试数据

declare @table table (connect varchar(30))

insert into @table

select '我爱程序' union all

select '我的程序生活' union all

select '绝对无聊的生活' union all

select '活得好累' union all

select '程序员的生活' union all

select '序论' union all

select '生机' union all

select '生活杂志' union all

select '我只是随便写写' union all

select '真的是要来搜索的' union all

select '程序员一生的活路'



--普通的模糊查询

select * from @table where connect like '%程序生活%'

--运行结果

/*

connect

------------------------------

我的程序生活

*/



--应用函数查询

select * from @table where connect like ( select dbo.[m_fuzzyquery_v1]('程序生活'))

--运行结果

/*

connect

------------------------------

我的程序生活

程序员的生活

程序员一生的活路

*/

没有考虑位置的顺序。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧