create table a( id int identity, subject varchar(10), keyword varchar(100) )insert into a values('信息主题1','电脑,电脑主机,联想电脑') insert into a values('信息主题2','电脑主机,联想电脑') insert into a values('信息主题3','显示器,三星显示器')select * from a where ','+keyword+',' like '%,电脑,%'-- id subject keyword ----------- ---------- -------------------------------------------------------------------1 信息主题1 电脑,电脑主机,联想电脑(所影响的行数为 1 行)
在keyword 的前和后都加上, 变成如下信息 ID subject keyword 1 信息主题1 ,电脑,电脑主机,联想电脑, 2 信息主题2 ,电脑主机,联想电脑, 3 信息主题3 ,显示器,三星显示器, 做任何查询都把关键字加上两个, 比如查询“电脑” select * from table where keywork like '%,电脑,%'查询“电脑主机” select * from table where keywork like '%,电脑主机,%'
两种方法:Declare @S Nvarchar(1000) Set @S=N'电脑' Select * from TableName Where CharIndex(','+@S+',',','+keyword+',')>0OrSelect * from TableName Where ','+keyword+',' Like ('%,'+@S+',%')
这个性能好一些 charindex(',电脑主机,',','+ keyword+ ',')>0
--建立测试环境 Create Table TEST( ID Int Identity, subject Nvarchar(10), keyword Nvarchar(100)) --插入数据 Insert Into TEST Values(N'信息主题1',N'电脑,电脑主机,联想电脑') Insert Into TEST Values(N'信息主题2',N'电脑主机,联想电脑') Insert Into TEST Values(N'信息主题3',N'显示器,三星显示器') --测试 Declare @S Nvarchar(1000) Set @S=N'电脑' --方法一: Select * from TEST Where CharIndex(','+@S+',',','+keyword+',')>0 --方法二: Select * from TEST Where ','+keyword+',' Like ('%,'+@S+',%') --删除测试环境 Drop Table TEST --结果 /* --方法一 ID subject keyword 1 信息主题1 电脑,电脑主机,联想电脑--方法二 ID subject keyword 1 信息主题1 电脑,电脑主机,联想电脑 */
Create Table TEST( ID Int Identity, subject Nvarchar(10), keyword Nvarchar(100)) --插入?据 Insert Into TEST Values(N'信息主?1',N'??,??主机,?想??') Insert Into TEST Values(N'信息主?2',N'??主机,?想??') Insert Into TEST Values(N'信息主?3',N'?示器,三星?示器')做任何查询都把关键字加上两个, 比如查询“电脑” select * from test where ','+keywork+',' like '%,电脑,%'查询“电脑主机” select * from test where +','keywork+',' like '%,电脑主机,%'
id int identity,
subject varchar(10),
keyword varchar(100)
)insert into a values('信息主题1','电脑,电脑主机,联想电脑')
insert into a values('信息主题2','电脑主机,联想电脑')
insert into a values('信息主题3','显示器,三星显示器')select * from a
where ','+keyword+',' like '%,电脑,%'--
id subject
keyword
----------- ---------- -------------------------------------------------------------------1 信息主题1 电脑,电脑主机,联想电脑(所影响的行数为 1 行)
变成如下信息
ID subject keyword
1 信息主题1 ,电脑,电脑主机,联想电脑,
2 信息主题2 ,电脑主机,联想电脑,
3 信息主题3 ,显示器,三星显示器,
做任何查询都把关键字加上两个,
比如查询“电脑”
select * from table where keywork like '%,电脑,%'查询“电脑主机”
select * from table where keywork like '%,电脑主机,%'
Set @S=N'电脑'
Select * from TableName Where CharIndex(','+@S+',',','+keyword+',')>0OrSelect * from TableName Where ','+keyword+',' Like ('%,'+@S+',%')
charindex(',电脑主机,',','+ keyword+ ',')>0
Create Table TEST(
ID Int Identity,
subject Nvarchar(10),
keyword Nvarchar(100))
--插入数据
Insert Into TEST Values(N'信息主题1',N'电脑,电脑主机,联想电脑')
Insert Into TEST Values(N'信息主题2',N'电脑主机,联想电脑')
Insert Into TEST Values(N'信息主题3',N'显示器,三星显示器')
--测试
Declare @S Nvarchar(1000)
Set @S=N'电脑'
--方法一:
Select * from TEST Where CharIndex(','+@S+',',','+keyword+',')>0
--方法二:
Select * from TEST Where ','+keyword+',' Like ('%,'+@S+',%')
--删除测试环境
Drop Table TEST
--结果
/*
--方法一
ID subject keyword
1 信息主题1 电脑,电脑主机,联想电脑--方法二
ID subject keyword
1 信息主题1 电脑,电脑主机,联想电脑
*/
我还想问一个问题.
两种方法(like语句和charinde()函数),从速度上考虑,我应该选择哪一种呢.
我表中建立了索引,好像用表达式"CharIndex(','+@S+',',','+keyword+',')>0"查询,会忽略索引是不是的.
用"like"我感觉数据很多的时候(达到60万以上时),速度会变慢(不知道大家不有这种认为).
你能不能给我讲具体点,怎么样建立明细表,分拆"keyword"字段值,能不能给具体代码.
上面那两种方法,还有另一个问题.有时候“keyword”字符值就是一个词语,前后没有逗号(,),所以就搜索不到。例如:keyword里面就一个词语“电脑”。
我也正想找一种更好的方法,来代替"like"语句。
谢谢!
好办法!
ID Int Identity,
subject Nvarchar(10),
keyword Nvarchar(100))
--插入?据
Insert Into TEST Values(N'信息主?1',N'??,??主机,?想??')
Insert Into TEST Values(N'信息主?2',N'??主机,?想??')
Insert Into TEST Values(N'信息主?3',N'?示器,三星?示器')做任何查询都把关键字加上两个,
比如查询“电脑”
select * from test where ','+keywork+',' like '%,电脑,%'查询“电脑主机”
select * from test where +','keywork+',' like '%,电脑主机,%'