VB6中查询Access记录,如何按指定ID顺序返回结果?
问题
执行以下查询:
select * from [main] where id in (33,11,22) order by id
返回记录顺序为11、22、33,但期望按IN子句中的顺序33、11、22返回。
尝试使用CHARINDEX函数的语句:
select * from [main] where id in (33,11,22) order by charindex(ltrim(id),'33,11,22')
但VB6环境报错:The expression contains undefined function call CHARINDEX。
改用INSTR替代后:
select * from [main] where id in (33,11,22) order by instr('33,11,22', ltrim(id))
查询可运行,但返回顺序为33、22、11,不符合预期。
解决方案
方法1:带分隔符的INSTR匹配(解决部分匹配问题)
原INSTR写法可能因部分字符串匹配导致排序异常(比如数字id的字符串形式可能被误匹配),修改为包裹分隔符的写法:
select * from [main] where id in (33,11,22) order by instr(',33,11,22,', ',' & ltrim(str(id)) & ',')
- 给目标序列和每个id前后都添加逗号,确保每个id作为独立项被匹配
str(id)将数字id转为字符串,避免类型自动转换引发的匹配错误
方法2:IIF函数指定排序优先级(直观可靠)
直接为每个目标id分配排序权重,完全按需求顺序排列:
select * from [main] where id in (33,11,22) order by iif(id=33, 1, iif(id=11, 2, iif(id=22, 3, 4)))
- 权重数值越小,排序越靠前,严格遵循
33→11→22的顺序 - VB6常用的Jet SQL原生支持
IIF函数,无兼容性问题
方法3:CASE语句(适用于支持CASE的数据库)
若使用的数据库支持CASE语法(如新版Access),可采用更清晰的写法:
select * from [main] where id in (33,11,22) order by case id when 33 then 1 when 11 then 2 when 22 then 3 end
内容的提问来源于stack exchange,提问作者user1928432
相关产品推荐
相关产品推荐

