存储过程里面,要判断一个字符串是否包含指定的字符串,该怎么写?

ntwqy_2008 2008-12-15 02:16:49
存储过程里面,要判断一个字符串是否包含指定的字符串,该怎么写?
@a varchar(10) 假设@a="a" 然后 set @value='select 字段1 from 表A'

想判断@value中是否包含@a的值(也就是"a"),请问该怎么写啊??新手求助..

...全文
2173 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ntwqy_2008 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dobear_0922 的回复:]
SQL code--try
CREATE PROCEDURE [dbo].[OLTR_ExamSelectSingleByTestID] (
@TestID nvarchar(30)
)
AS

declare @value varchar(2000)

--set @value='select Single from OLTR_ExamTestPaper '
if exists(select [Single] from OLTR_ExamTestPaper where charindex(@TestID, [Single])>0)
print '包含'
else
print '不包含'

exec [dbo].[OLTR_ExamSelectSingleByTestID] 'SI08110001'
[/Quote]
对了。。谢谢你朋友。马上结贴.!
dobear_0922 2008-12-15
  • 打赏
  • 举报
回复
--try
CREATE PROCEDURE [dbo].[OLTR_ExamSelectSingleByTestID] (
@TestID nvarchar(30)
)
AS

declare @value varchar(2000)

--set @value='select Single from OLTR_ExamTestPaper '
if exists(select [Single] from OLTR_ExamTestPaper where charindex(@TestID, [Single])>0)
print '包含'
else
print '不包含'

exec [dbo].[OLTR_ExamSelectSingleByTestID] 'SI08110001'
dawugui 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ntwqy_2008 的回复:]
@a的值我传的是 SI08110001 set @value='select Single from 表A' 的值应该为:SI08110001,SI08110002,

CREATE PROCEDURE [dbo].[OLTR_ExamSelectSingleByTestID] (
@TestID nvarchar(30)
)
AS

declare @value varchar(2000)

set @value='select Single from OLTR_ExamTestPaper '

if (charindex(@TestID, @value)>0)
print '包含'
else
print '不包含'

exec [dbo].[OLTR_ExamSelectSingleByTestID] 'SI08110001' 测试了一下显示 不包含 怎么回事啊
[/Quote]


/*
标题:分解字符串并查询相关数据
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间: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 行)
*/

dobear_0922 2008-12-15
  • 打赏
  • 举报
回复
CREATE  PROCEDURE [dbo].[OLTR_ExamSelectSingleByTestID] ( 
@TestID nvarchar(30)
)
AS

declare @value varchar(2000)

select @value=Single from OLTR_ExamTestPaper

if (charindex(@TestID, @value)>0)
print '包含'
else
print '不包含'

exec [dbo].[OLTR_ExamSelectSingleByTestID] 'SI08110001'
ntwqy_2008 2008-12-15
  • 打赏
  • 举报
回复
@a的值我传的是 SI08110001 set @value='select Single from 表A' 的值应该为:SI08110001,SI08110002,

CREATE PROCEDURE [dbo].[OLTR_ExamSelectSingleByTestID] (
@TestID nvarchar(30)
)
AS

declare @value varchar(2000)

set @value='select Single from OLTR_ExamTestPaper '

if (charindex(@TestID, @value)>0)
print '包含'
else
print '不包含'

exec [dbo].[OLTR_ExamSelectSingleByTestID] 'SI08110001' 测试了一下显示 不包含 怎么回事啊
水族杰纶 2008-12-15
  • 打赏
  • 举报
回复
charindex()
patindex()
like
dobear_0922 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ntwqy_2008 的回复:]
是不是里面只要有我给的字符串不管有没有分隔符都能比出来,所以@value里不管有没有,号分割一样比较???不用分割?!
[/Quote]

直接比较的话用8楼,整字匹配用11楼,区别:
如果@a='1', @value='12,13,14',用8楼的方法直接比较,则认定为@value包含@a,用11楼整字匹配,则认定为不包含。
ntwqy_2008 2008-12-15
  • 打赏
  • 举报
回复
是不是里面只要有我给的字符串不管有没有分隔符都能比出来,所以@value里不管有没有,号分割一样比较???不用分割?!
dobear_0922 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ntwqy_2008 的回复:]
@value 里含有,号 如何分割,号再比较啊???????????

比如说@value的值是:a,b,c,d, 我要查找a
[/Quote]

if charindex(','+@a+',', ','+@value+',')>0
print '包含'
else
print '不包含'
ws_hgo 2008-12-15
  • 打赏
  • 举报
回复
http://blog.csdn.net/ws_hgo/archive/2008/12/10/3493153.aspx

ws_hgo 2008-12-15
  • 打赏
  • 举报
回复
---1字符串拆分 
/*
有字符串1,23,a
要求按逗号拆分为表
1
23
a
*/
--(1)第一种方法(循环截取法)
create function FC_SlpitStr(@Str nvarchar(4000),@Split nvarchar(100))
returns @R table (Col nvarchar(100))
as
begin
declare @StrLen int
set @StrLen=len(@Str)
while charindex(@Split,@StrLen)>0
begin
insert into @R values(left(@Str,charindex(@Split,@StrLen)-1))
set @Str=stuff(@Str,1,charindex(@Split,@StrLen),'')
end
insert into @R values(@Str)
return
end
--print dbo.FC_SlpitStr('1,23,a',',')

--[database_name.]owner_name.function_name ([argument_expr][,...])
declare @a nvarchar(4000)
set @a='1,23,a'
select dbo.FC_SlpitStr(@a,',')
--(2)动态T-sql语句
declare @S varchar(100)
set @s='1,23,a'

declare @sql varchar(100)
set @sql='select col='''+replace(@S, ',' , ''' union all select ''')+''''
print(@sql)

dobear_0922 2008-12-15
  • 打赏
  • 举报
回复
想判断@value中是否包含@a的值(也就是"a"),请问该怎么写啊??新手求助..

if charindex(@a, @value)>0
print '包含'
else
print '不包含'
ntwqy_2008 2008-12-15
  • 打赏
  • 举报
回复
@value 里含有,号 如何分割,号再比较啊???????????

比如说@value的值是:a,b,c,d, 我要查找a
ws_hgo 2008-12-15
  • 打赏
  • 举报
回复
/*
@a varchar(10) 假设@a="a" 然后 set @value='select 字段1 from 表A'
*/
declare varchar(10)
set @a=a
set @value='select 字段1 from 表A'
if (charindex(@a,@value)>0)
begin
print '@value存在@a'
end
else
begin
print '@value不存在@a'
end
百年树人 2008-12-15
  • 打赏
  • 举报
回复
declare @a varchar(10)
set @a='a'
set @value='select 字段1 from 表A'
if charindex(@a,@value) > 0
print '@value存在@a'
dawugui 2008-12-15
  • 打赏
  • 举报
回复
if exists(select 1 from 表A where charindex(@a , 字段1) > 0)

select 字段1 , case when charindex(@a , 字段1) > 0 then '存在' else '不存在' end from 表A
dawugui 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 ntwqy_2008 的帖子:]
存储过程里面,要判断一个字符串是否包含指定的字符串,该怎么写?
@a varchar(10) 假设@a="a" 然后 set @value='select 字段1 from 表A'

想判断@value中是否包含@a的值(也就是"a"),请问该怎么写啊??新手求助..

[/Quote]

if exists(select 1 from 表A where charindex(@a , 字段1) > 0)
liangCK 2008-12-15
  • 打赏
  • 举报
回复
CHARINDEX('子字符串','父字符串')>0 --表示存在
hyde100 2008-12-15
  • 打赏
  • 举报
回复
if charindex(@a,@value) > 0
print 'a'

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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