简单查询问题,期待高手再次出现 期待大力、邹建。。。 在线等待

Anhowe 2006-07-01 12:20:47
我有一个存储过程,在其参数中参传查询条件,如下简单查询所示
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
select * from categories where categoryname like ('%'+@str +'%')
--但因为like中的值有多个且用','分隔开了,所以查询时根本查不到所想要的记录
--现急向多位大哥大姐求救,怎么样才能查到我想要的结果?
--谢谢!!!!!!!!!!!!!!!!!!!!!!!!!!在线等
--如上条件为set @str='be,con'时,应查出的值有Beverages / Condiments / Confections 即类似于
--select * from categories where categoryname like '%be%' or categoryname like '%con%'
...全文
246 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
playwarcraft 2006-07-01
  • 打赏
  • 举报
回复
--先定义个function
Create FUNCTION SplitList
(@separator char(1), @List varchar(8000))
RETURNS @ReturnTable TABLE(ListItem varchar(1000) COLLATE Database_Default)
AS
BEGIN
DECLARE @Index int
DECLARE @NewText varchar(8000)
IF @List = null
RETURN
SET @Index = CHARINDEX(@separator, @List)
WHILE NOT(@Index = 0)
BEGIN
SET @NewText = RTRIM(LTRIM(LEFT(@List, @Index - 1)))
SET @List = RIGHT(@List, LEN(@List) - @Index)
INSERT INTO @ReturnTable(ListItem) VALUES(@NewText)
SET @Index = CHARINDEX(@separator, @List)
END

INSERT INTO @ReturnTable(ListItem) VALUES(RTRIM(LTRIM(@List)))

RETURN
END

--在定义存储程序
create table #temp (...) -- 与表categories结构一致
declare @str nvarchar(100),@Item nvarchar(100)
set @str='be,con'
declare c1 cursor scroll for
select listItem from SplitList(',',@str) T
open c1
fetch first from c1 into @Item
while @@fetch_status=0
begin
insert into #temp
select * from categories where categoryname like ('%'+@str +'%')
fetch next from c1 into @Item
end
select * from #temp
close c1
deallocate c1
zjcxc 元老 2006-07-01
  • 打赏
  • 举报
回复
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
declare @where varchar(8000)
set @where = 'categoryname like ''%' + replace(@str, ',', '%'' or categoryname like ''%') + '%'''
exec('
select * from categories where '+@where)
zjcxc 元老 2006-07-01
  • 打赏
  • 举报
回复
use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
declare @where varchar(8000)
set @where = 'categoryname like ''%' + replace(@str, ',', '%'' and categoryname like ''%') + '%'''
exec('
select * from categories where '+@where)
Anhowe 2006-07-01
  • 打赏
  • 举报
回复
LouisXIV(夜游神) 大哥,还有什么好办法吗?因为我那个条件是不不确定值,内容不是某个列中的完整值,而是列中的部份值

不过很谢谢您这么快对我问题的关注
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复


--try

use northwind
declare @str nvarchar(100)
set @str='be,con'
declare @sql varchar(8000)
set @sql=('select * from categories where categoryname like '+'''%'+replace(@str,',','%'' or categoryname like ''%') +'%''')
exec (@sql)
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复
没看清楚-_-

上面的放弃
LouisXIV 2006-07-01
  • 打赏
  • 举报
回复
--try

use northwind
declare @str nvarchar(100)--为参数中传过来的值
set @str='be,con'--根据具体情况,可能包含更多的值,如'be,con,dai'等等,只有用户使用时才确定
select * from categories where charindex(','+categoryname+',',','+@str +',')>0
fcuandy 2006-07-01
  • 打赏
  • 举报
回复
SELECT categories.* FROM categories
INNER JOIN dbo.Split(@str,',')
ON CAHRINDEX(tempColumn,categoryname)>0

split函數
CREATE Function Split(@Sql varchar(8000),@Splits varchar(100))
returns @temp Table (tempColumn varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+len(@Splits),Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
End

34,838

社区成员

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

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