求SQL语句,给100分

chilli6519 2010-12-08 02:54:41
加精
--请大家帮忙,给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的数据行
...全文
2969 232 打赏 收藏 转发到动态 举报
写回复
用AI写文章
232 条回复
切换为时间正序
请发表友善的回复…
发表回复
anlianganl 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fpzgm 的回复:]
引用 12 楼 chilli6519 的回复:
3楼请输入 7,9,8 试一下,怎么少了eventid = 6的那一行。



SQL code
--建表SQL语句
if OBJECT_ID('TBC_EventInfo','U') is not null
drop table TBC_EventInfo
go
create table TBC_EventInfo
(
ev……
[/Quote]
select @a='7,9,8'

改成 select @a='7,9,8,12,'呵呵 不准确了
ajxzl 2010-12-17
  • 打赏
  • 举报
回复
看不懂,学习学习
lanxi1998 2010-12-17
  • 打赏
  • 举报
回复
*
标题:分解字符串并查询相关数据
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-18
地点:广东深圳
说明:通过使用函数等方法分解字符串查询相关数据。

问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
例如 @str = '1,2,3',查询下表得到记录1,4,5,6
ID TypeID
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
6 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 + ',') > 0
select * from tb where ',' + TypeID + ',' like '%,' + @str + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
(所影响的行数为 1 行)
*/

-----------------------------
--如果包含两个,如@str = '1,2'.
declare @str as varchar(30)
set @str = '1,2'
select * from tb where charindex(',' + left(@str , charindex(',' , @str) - 1) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',' , ',' + typeid + ',') > 0
select * from tb where ',' + typeid + ',' like '%,' + left(@str , charindex(',' , @str) - 1) + ',%' or
',' + typeid + ',' like '%,' + substring(@str , charindex(',' , @str) + 1 , len(@str)) + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
4 2,6
(所影响的行数为 3 行)
*/

-------------------------------------------
--如果包含三个或四个,用PARSENAME函数来处理.
declare @str as varchar(30)
set @str = '1,2,3,4'
select * from tb where
charindex(',' + parsename(replace(@str , ',' , '.') , 4) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 3) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 2) + ',' , ',' + typeid + ',') > 0 or
charindex(',' + parsename(replace(@str , ',' , '.') , 1) + ',' , ',' + typeid + ',') > 0
select * from tb where
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 4) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 3) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 2) + ',%' or
',' + typeid + ',' like '%,' + parsename(replace(@str , ',' , '.') , 1) + ',%'
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/

---------------------------------------
--如果超过四个,则只能使用函数或动态SQL来分解并查询数据。
/*
名称:fn_split函数.
功能:实现字符串分隔功能的函数
*/
create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator , @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr , @i - 1))
set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)
set @i = charindex(@seprator , @inputstr)
end
if @inputstr <> '\'
insert @temp values(@inputstr)
return
end
go

--调用
declare @str as varchar(30)
set @str = '1,2,3,4,5'

select distinct m.* from tb m,
(select * from dbo.fn_split(@str,',')) n
where charindex(',' + n.a + ',' , ',' + m.typeid + ',') > 0

drop table tb
drop function dbo.fn_split

/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/

------------------------------------------
--使用动态SQL的语句。
declare @str varchar(200)
declare @sql as varchar(1000)
set @str = '1,2,3,4,5'
set @sql = 'select ''' + replace(@str , ',' , ''' as id union all select ''')
set @sql = @sql + ''''
set @sql = 'select distinct a.* from tb a , (' + @sql + ') b where charindex(' + ''','' + b.id + ' + ''',''' + ' , ' + ''','' + a.typeid + ' + ''',''' + ') > 0 '
exec (@sql)
/*
ID TypeID
----------- ------------------------------
1 1,2,3,4,5,6,7,8,9,10,11,12
2 2,3
3 3,7,8,9
4 2,6
5 4,5
(所影响的行数为 5 行)
*/
lanxi1998 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 dawugui 的回复:]
貌似就是我的这篇文章.

SQL code

/*
标题:分解字符串并查询相关数据
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-18
地点:广东深圳
说明:通过使用函数等方法分解字符串查询相关数据。

问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。
例如 @str = '1,2,3',查询下表得到记录1,4,5,6
ID……
[/Quote]

0
sabee7989 2010-12-16
  • 打赏
  • 举报
回复
观望一下
zhenghaowu 2010-12-16
  • 打赏
  • 举报
回复
看不懂
hankanling123 2010-12-16
  • 打赏
  • 举报
回复
我就看看。学习,学习
a543362503 2010-12-16
  • 打赏
  • 举报
回复
这是什么东西
上大范甘迪 2010-12-16
  • 打赏
  • 举报
回复
好难啊~~
ljtshihouzi 2010-12-16
  • 打赏
  • 举报
回复
oracle 用户路过
zerepxan 2010-12-16
  • 打赏
  • 举报
回复
好深奥啊,我什么时候才能看懂这些啊??慢慢学习吧。。
bentu888 2010-12-15
  • 打赏
  • 举报
回复
好多分可惜拿不到了
qq124869079 2010-12-15
  • 打赏
  • 举报
回复
可惜我也帮不上忙 100分 哎
xuping1220 2010-12-15
  • 打赏
  • 举报
回复
学习学习哦!虽然看不懂得!
wzic 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 nhjnthl 的回复:]
好多分可惜拿不到了
[/Quote]

就是 没分了呢
KangYuXing666 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fcuandy 的回复:]
SQL code
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),
Keyword…… 差不多这样了
lwien 2010-12-15
  • 打赏
  • 举报
回复
正在学习 加油!
GBA753951 2010-12-15
  • 打赏
  • 举报
回复
对sql表示不了解
zhouzhoudou 2010-12-14
  • 打赏
  • 举报
回复
拆出一个关系表
liangyp123 2010-12-14
  • 打赏
  • 举报
回复
思考中……
加载更多回复(140)

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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