高分求一个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,'/',',')
这样不行,不知各位有什么好办法?
...全文
391 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的啊

34,838

社区成员

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

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