一个表有一个自增字段(CmdID int identity(1,1)),当用户传给我一个字符串(如:"1,2,5,6,8,9,10,11,12,20"),也就是说,从表中要查询出CmdID=1或CmdID=2或CmdID=5或CmdID=6或CmdID=8或CmdID=9或CmdID=10或CmdID=11或CmdID=12或CmdID=20的记录,我知道这个SQL语句应该是这样写:select * from Command where CmdID in (1,2,3,5,6,8,9,10,11,12,20),但在SQL中如何把字符串"1,2,5,6,8,9,10,11,12,20"转成(1,2,3,5,6,8,9,10,11,12,20)? 上述问题,敬请各位老师指教!谢谢!
----------------------------------------------
不要等到孤独寂寞时才想起朋友,不要等到穷困潦倒时才想起发奋,不要等到疾病缠身时才想起健康。。。
你这个写法是要使用动态SQL呀! 对于SQLserver 'select * from Command where CmdID in('+cast(用户传入字符串 as varchar)+')' 对于Oracle 'select * from Command where CmdID in(' || 用户传入字符串 || ')' 对于MySQL concat( 'select * from Command where CmdID in(', 用户传入字符串. ')' ) 然后执行这个SQL即可
但是动态SQL效率比较低,而且你的in值比较多,如果返回数据很多的话效率是极低的! 如果可能的话使用表连接可能效率会高一些,不过这种方法需要一个临时表X,将用户传入的数据拆分后每个CmdID一行存入,然后使用 select * from Command a, X where a.comid = x.comid 如果有索引会更快 以上三种数据库都支持临时表,不过要注意SQLServer要创建全局临时表
SELECT bh FROM ( SELECT Name = CONVERT(XML, '<root><v>' + REPLACE('1,2,5,6,8,9,10,11,12,20', ',', '</v><v>') + '</v></root>') ) a OUTER APPLY ( SELECT bh = C.v.value('.', 'nvarchar(100)') FROM a.Name.nodes('/root/v') C ( v ) ) b
----------------------------------------------
-