高分求一个SQL算法问题

jeremy 2013-03-23 02:15:11
数据库有个字段里存了一个以/分隔的ID
如: 1/1003/1145/1148/1174
我现在想取出这个些ID的记录, 等于1,1003,1145,1148,1174 的记录,有没有办法?
我用 ID IN (
SELECT replace(1/1003/1145/1148/1174,'/',',')
这样不行,不知各位有什么好办法?
...全文
311 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
md5e 2013-03-25
Select * From aa Where ('/'+ '1/1003/1145/1148/1174' +'/' ) like ('%/'+cast(id as nvarchar) +'/%')
回复
大唐剑客 2013-03-25
给你一个简单有效的办法,自己看一下怎么用吧。 select * from table where (select '/日志1221/日志1331//日志1551/') like ('%/'+ ID+ '/%')
回复
lbb398229882 2013-03-23
不知道这样是不是楼主想要的结果,没有表数据就随便模拟了个数据 create table AAAA ( ID int primary key identity , Id_F varchar(500) ) insert into AAAA values('1/1001') insert into AAAA values('1/1002') insert into AAAA values('1/1003') insert into AAAA values('1/1002/1005') select * from AAAA select * into #kk from AAAA --将数据库插入到一个临时表是为看下面的update操作不改变原始数据,避免不比要的失误 select * from #kk update #kk set Id_F=(select replace(Id_F,'/',',') from #kk as a where a.ID=#kk.ID ) select * from #kk 这里就可以把#kk表做为数据源来取想要的数据了
回复
jeremy 2013-03-23
replace('1/1003/1145/1148/1174','/',',') 这样的东西在IN里面用一定要通过EXEC的方式吗?还有别的方式可以不?
回复
jeremy 2013-03-23
因为我是在一个很复杂JOIN了好多表的SQL语句里要做这件事,目的是根据FULL_DEPT_ID 的次次关系找到我需要的那一级的数据
回复
jeremy 2013-03-23
seusoftware 在吗?现在问题是我没办法执行EXEC啊
回复
seusoftware 2013-03-23
引用 6 楼 xywhnh 的回复:
数据库结构如图
那就把表里的字符串先连到一起啊,然后replace再exec,和上面一样,以F_FULL_DEPT_ID 为例:

declare @c varchar(max)
set @c = ''
select @c = @c +'/'+ F_FULL_DEPT_ID from table1
set @c = replace(right(@c,len(@c)-1),'/',',')
exec('select * from table2 where ID in('+@c+')')
回复
jeremy 2013-03-23
2楼同学的方法果然可以,但是我的1/1003/1145/1148/1174 是在一个列里面的,现在要同时取多行,在select 里又不能执行EXEC,尴尬了
回复
jeremy 2013-03-23
TO:seusoftware 按你的方式定义了变量,并设置了值,但还是不行啊,程序还是认为整个是一个变量,而没有当成一个集合
回复
Mr_Nice 2013-03-23
DECLARE @i varchar(10)
SET @i = '123'

DECLARE @value VARCHAR(200)
SET @value = '1/123/143/124546/'

SELECT CHARINDEX(@i,@value,0)
结果如果大于0 ,就判定为含有了哦。 不过这个不是非常严谨的,如果要非常严谨,lz需要拆分出来然后inner join 看看
回复
seusoftware 2013-03-23
replace之后,sql server事实上把1,1003,1145,1148,1174当成字符串了,可以这样做: declare @c varchar(2000) select @c = replace('1/1003/1145/1148/1174','/',',') set @c = 'select * from t2 where ID in ('+@c+')' --print @c exec(@c)
回复
-Tracy-McGrady- 2013-03-23
你这个到底有几列列名为ID的啊
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2013-03-23 02:15
社区公告
暂无公告