现在有这样一个表
select * from Student
我想查询出
所有id=1的ids里包含的id的列表集合
一般我们会这么写
select * from Student where Id in (select Ids from Student where Id=1)
但是实际的情况是会报错
那么这么写错误的原因是什么呢?
我们想要的查询语句是
select * from Student where Id in (1,2,3)
实际的情况却是
select * from Student where Id in (‘1,2,3’)
in () 只能查询 int
那么我们应该怎么办?
正确的写法
select * from Student where charindex(’,’+ltrim(Id)+’,’,’,’+(select Ids from Student where Id=1) +’,’)>0
简单的说一下 CHARINDEX函数
CHARINDEX和PATINDEX函数常常用来在一段字符中搜索字符或者字符串。如果被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数。
那么在下面这句话的大概的意思就是
select * from Student where charindex(’,’+ltrim(Id)+’,’,’,’+(select Ids from Student where Id=1) +’,’)>0
查询出所有 ‘,’+(select Ids from Student where Id=1) +’,’ 包含 ‘,’+ltrim(Id)+’,’ 的集合
也就是字符串,1,2,3, 含有 ,1, ,2, ,3, 这三个值
select * from Student where charindex(’,’+ltrim(Id)+’,’,’,’+(select Ids from Student where Id=1) +’,’)>0
返回的就是id为这三个值的集合
上述如若有不妥之处,还望指正。