求SQL语句,给100分解决办法

求SQL语句,给100分--请大家帮忙,给100分。--建表SQL语句if OBJECT_ID(TBC_EventInfo,U) is not nulldro

求SQL语句,给100分
--请大家帮忙,给100分。

--建表SQL语句
if OBJECT_ID('TBC_EventInfo','U') is not null
drop table TBC_EventInfo
go
create table TBC_EventInfo
(
eventID int primary key,
eventName varchar(200),
VideoUrl varchar(256),
KeywordSet varchar(100)
)

--数据
insert into TBC_EventInfo values(1,'早期教育','www.csdn.net/a.wma',',1,2,3,4,')
insert into TBC_EventInfo values(2,'营养性疾病','www.csdn.net/a.wma',',1,3,5,')
insert into TBC_EventInfo values(3,'西欧早期教育','www.csdn.net/a.wma',',1,7,8,9,')
insert into TBC_EventInfo values(4,'婴幼儿生理特点','www.csdn.net/a.wma',',4,6,')
insert into TBC_EventInfo values(5,'理解孩子的成长','www.csdn.net/a.wma',',5,7,')
insert into TBC_EventInfo values(6,'让我们共同分享','www.csdn.net/a.wma',',6,9')
insert into TBC_EventInfo values(7,'社会适应能力','www.csdn.net/a.wma',',10,7,')
insert into TBC_EventInfo values(8,'学前脑开发','www.csdn.net/a.wma',',5,9,')
insert into TBC_EventInfo values(9,'教养方式','www.csdn.net/a.wma',',2,4,')
insert into TBC_EventInfo values(10,'行为课程的开发','www.csdn.net/a.wma',',6,12,')

--问题
--其中KeywordSet列存储了以,分隔的另一个表的id;
--要求根据传入的 一个以,分隔的id的字符串 IDs 
--查找TBC_EventInfo.KeywordSet列中包含IDs中一个或多个id的行。
--例如:
--1、传入参数 "1,2," 要求查询结果中包括所有KeywordSet列包含 ",1," 或 ",2,"的
--返回结果应包含 eventID 为1、2、3、9的数据行
--2、传入参数 "5,7,9" 要求查找结果中包信所有KeywordSet列包含 ",5," 、 ",7,"、",9,"的
--返回结果应包含eventID 为2、3、5、6、7、8的数据行


[解决办法]
这么设计太“高明”了,查询也就需要高明的方法

按我不高明的想法,拆出一个关系表不是写法就简单了吗
[解决办法]

SQL code
if OBJECT_ID('TBC_EventInfo','U') is not nulldrop table TBC_EventInfogocreate table TBC_EventInfo(eventID int primary key,eventName varchar(200),VideoUrl varchar(256),KeywordSet varchar(100))--数据insert into TBC_EventInfo values(1,'早期教育','www.csdn.net/a.wma',',1,2,3,4,')insert into TBC_EventInfo values(2,'营养性疾病','www.csdn.net/a.wma',',1,3,5,')insert into TBC_EventInfo values(3,'西欧早期教育','www.csdn.net/a.wma',',1,7,8,9,')insert into TBC_EventInfo values(4,'婴幼儿生理特点','www.csdn.net/a.wma',',4,6,')insert into TBC_EventInfo values(5,'理解孩子的成长','www.csdn.net/a.wma',',5,7,')insert into TBC_EventInfo values(6,'让我们共同分享','www.csdn.net/a.wma',',6,9')insert into TBC_EventInfo values(7,'社会适应能力','www.csdn.net/a.wma',',10,7,')insert into TBC_EventInfo values(8,'学前脑开发','www.csdn.net/a.wma',',5,9,')insert into TBC_EventInfo values(9,'教养方式','www.csdn.net/a.wma',',2,4,')insert into TBC_EventInfo values(10,'行为课程的开发','www.csdn.net/a.wma',',6,12,')DECLARE @STR VARCHAR(8000)SELECT @STR='5,7,9'IF @STR LIKE ',%' SET @STR=STUFF(@STR,1,1,'')IF @STR LIKE '%,' SET @STR=LEFT(@STR,LEN(@STR)-1)SET @STR='('',''+KeywordSet+'','' LIKE ''%,'+REPLACE(@STR,',',',%'' OR '',''+KeywordSet+'','' LIKE ''%,')+',%'')'EXEC ('SELECT * FROM TBC_EventInfo WHERE '+@STR)/*2    营养性疾病    www.csdn.net/a.wma    ,1,3,5,3    西欧早期教育    www.csdn.net/a.wma    ,1,7,8,9,5    理解孩子的成长    www.csdn.net/a.wma    ,5,7,6    让我们共同分享    www.csdn.net/a.wma    ,6,97    社会适应能力    www.csdn.net/a.wma    ,10,7,8    学前脑开发    www.csdn.net/a.wma    ,5,9,*/
[解决办法]
SQL code
--建表SQL语句if OBJECT_ID('TBC_EventInfo','U') is not nulldrop table TBC_EventInfogocreate table TBC_EventInfo(eventID int primary key,eventName varchar(200),VideoUrl varchar(256),KeywordSet varchar(100))--数据insert into TBC_EventInfo values(1,'早期教育','www.csdn.net/a.wma',',1,2,3,4,')insert into TBC_EventInfo values(2,'营养性疾病','www.csdn.net/a.wma',',1,3,5,')insert into TBC_EventInfo values(3,'西欧早期教育','www.csdn.net/a.wma',',1,7,8,9,')insert into TBC_EventInfo values(4,'婴幼儿生理特点','www.csdn.net/a.wma',',4,6,')insert into TBC_EventInfo values(5,'理解孩子的成长','www.csdn.net/a.wma',',5,7,')insert into TBC_EventInfo values(6,'让我们共同分享','www.csdn.net/a.wma',',6,9')insert into TBC_EventInfo values(7,'社会适应能力','www.csdn.net/a.wma',',10,7,')insert into TBC_EventInfo values(8,'学前脑开发','www.csdn.net/a.wma',',5,9,')insert into TBC_EventInfo values(9,'教养方式','www.csdn.net/a.wma',',2,4,')insert into TBC_EventInfo values(10,'行为课程的开发','www.csdn.net/a.wma',',6,12,')declare @a varchar(100)select @a='1,2'select distinct t1.eventID from TBC_EventInfo t1 inner join(select substring(@a, number, charindex(',', @a + ',', number) - number) a  FROM master..spt_values  WHERE type='p' and substring(',' + @a,number, 1) = ',' )t2on CHARINDEX(','+t2.a+',',t1.KeywordSet)>0/*eventID1239*/select @a='5,7,9'select distinct t1.eventID from TBC_EventInfo t1 inner join(select substring(@a, number, charindex(',', @a + ',', number) - number) a  FROM master..spt_values  WHERE type='p' and substring(',' + @a,number, 1) = ',' )t2on CHARINDEX(','+t2.a+',',','+t1.KeywordSet+',')>0/*eventID235678*/ 


[解决办法]

SQL code
if OBJECT_ID('TBC_EventInfo','U') is not nulldrop table TBC_EventInfogocreate table TBC_EventInfo(eventID int primary key,eventName varchar(200),VideoUrl varchar(256),KeywordSet varchar(100))--数据insert into TBC_EventInfo values(1,'早期教育','www.csdn.net/a.wma',',1,2,3,4,')insert into TBC_EventInfo values(2,'营养性疾病','www.csdn.net/a.wma',',1,3,5,')insert into TBC_EventInfo values(3,'西欧早期教育','www.csdn.net/a.wma',',1,7,8,9,')insert into TBC_EventInfo values(4,'婴幼儿生理特点','www.csdn.net/a.wma',',4,6,')insert into TBC_EventInfo values(5,'理解孩子的成长','www.csdn.net/a.wma',',5,7,')insert into TBC_EventInfo values(6,'让我们共同分享','www.csdn.net/a.wma',',6,9')insert into TBC_EventInfo values(7,'社会适应能力','www.csdn.net/a.wma',',10,7,')insert into TBC_EventInfo values(8,'学前脑开发','www.csdn.net/a.wma',',5,9,')insert into TBC_EventInfo values(9,'教养方式','www.csdn.net/a.wma',',2,4,')insert into TBC_EventInfo values(10,'行为课程的开发','www.csdn.net/a.wma',',6,12,')GODECLARE @STR VARCHAR(8000)SELECT @STR='5,7,9'SELECT DISTINCT x.* FROM    (SELECT CAST('<r>' + REPLACE(@STR,',','</r><r>') + '</r>' AS XML) x) aCROSS APPLY    (SELECT v.value('.','int') id FROM a.x.nodes('//r') AS t(v)) bINNER JOIN  TBC_EventInfo x    ON CHARINDEX(','+RTRIM(b.id)+',',','+KeywordSet + ',')>0
[解决办法]
探讨
3楼请输入 7,9,8 试一下,怎么少了eventid = 6的那一行。

[解决办法]
探讨

3楼请输入 7,9,8 试一下,怎么少了eventid = 6的那一行。

[解决办法]
探讨

3楼能不能不用if,只一条sql语句解决?

[解决办法]
--建表SQL语句
if OBJECT_ID('TBC_EventInfo','U') is not null
drop table TBC_EventInfo
go
create table TBC_EventInfo
(
eventID int primary key,
eventName varchar(200),
VideoUrl varchar(256),
KeywordSet varchar(100)
)

--数据
insert into TBC_EventInfo values(1,'早期教育','www.csdn.net/a.wma',',1,2,3,4,')
insert into TBC_EventInfo values(2,'营养性疾病','www.csdn.net/a.wma',',1,3,5,')
insert into TBC_EventInfo values(3,'西欧早期教育','www.csdn.net/a.wma',',1,7,8,9,')
insert into TBC_EventInfo values(4,'婴幼儿生理特点','www.csdn.net/a.wma',',4,6,')
insert into TBC_EventInfo values(5,'理解孩子的成长','www.csdn.net/a.wma',',5,7,')
insert into TBC_EventInfo values(6,'让我们共同分享','www.csdn.net/a.wma',',6,9')
insert into TBC_EventInfo values(7,'社会适应能力','www.csdn.net/a.wma',',10,7,')
insert into TBC_EventInfo values(8,'学前脑开发','www.csdn.net/a.wma',',5,9,')
insert into TBC_EventInfo values(9,'教养方式','www.csdn.net/a.wma',',2,4,')
insert into TBC_EventInfo values(10,'行为课程的开发','www.csdn.net/a.wma',',6,12,')

declare @a varchar(100)
select @a='1,2'

select distinct t1.eventID from TBC_EventInfo t1 inner join
(select substring(@a, number, charindex(',', @a + ',', number) - number) a
FROM master..spt_values
WHERE type='p' and substring(',' + @a,number, 1) = ',' )t2
on CHARINDEX(','+t2.a+',',t1.KeywordSet)>0
/*
eventID
1
2
3
9
*/

select @a='5,7,9'
select distinct t1.eventID from TBC_EventInfo t1 inner join
(select substring(@a, number, charindex(',', @a + ',', number) - number) a
FROM master..spt_values
WHERE type='p' and substring(',' + @a,number, 1) = ',' )t2
on CHARINDEX(','+t2.a+',',','+t1.KeywordSet+',')>0
/*
eventID
2
3
5
6
7
8
*/
------解决方案--------------------


貌似就是我的这篇文章.

SQL code
/*标题:分解字符串并查询相关数据作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-03-18地点:广东深圳说明:通过使用函数等方法分解字符串查询相关数据。问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。例如 @str = '1,2,3',查询下表得到记录1,4,5,6ID TypeID1  1,2,3,4,5,6,7,8,9,10,11,122  2,3 3  3,7,8,9 4  2,6 5  4,56  6,7 */-----------------------------create table tb (ID int , TypeID varchar(30)) insert into tb values(1 , '1,2,3,4,5,6,7,8,9,10,11,12') insert into tb values(2 , '2,3') insert into tb values(3 , '3,7,8,9') insert into tb values(4 , '2,6') insert into tb values(5 , '4,5')insert into tb values(6 , '6,7')go-------------------------------如果仅仅是一个,如@str = '1'.declare @str as varchar(30)set @str = '1'select * from tb where charindex(',' + @str + ',' , ',' + TypeID + ',') > 0select * from tb where ',' + TypeID + ',' like  like left(b.地域代码,2)+'%' and a.地址 like '%'+c.省市区县+'%'left join    #1 d on d.地域代码>c.地域代码 and d.地域代码 like left(c.地域代码,4)+'%' and a.地址 like '%'+c.省市区县+'%'/*地址               地域代码------------------ -----------北京市东城区安定门 110101北京市经济开发区   110000*/