SQL IN()子句结果排序不符预期,需按指定顺序返回列数据类型
让SQL查询结果与IN()子句中的列顺序一致
我太懂这种烦恼了——明明在IN()里按自己想要的顺序列好了字段名,结果查出来的顺序却完全乱掉,跟预期的差了十万八千里。别担心,这里有几种靠谱的方法能让结果集严格按照你在IN()子句里指定的顺序返回:
通用方案:使用CASE语句(适用于所有SQL数据库)
这是最稳妥的方法,不管你用的是MySQL、PostgreSQL、SQL Server还是其他数据库,都能完美运行。原理是给每个目标字段分配一个自定义的排序优先级,让数据库按照这个优先级排序:
select data_Type_Name from data_type where displayName in('groupId','date') order by case displayName when 'groupId' then 1 when 'date' then 2 end;
这里我们给groupId分配了排序值1,date分配了2,数据库会按照这个数值从小到大排序,自然就会先返回groupId的数据类型,再返回date的。
MySQL/MariaDB专属:使用FIELD()函数
如果你用的是MySQL或者MariaDB,可以用更简洁的FIELD()函数来实现,省去写冗长CASE语句的麻烦:
select data_Type_Name from data_type where displayName in('groupId','date') order by field(displayName, 'groupId', 'date');
FIELD()函数的作用是返回第一个参数(这里是displayName)在后续参数列表中的位置。比如groupId在列表里是第1位,返回1;date是第2位,返回2,排序后就和你想要的顺序一致了。
PostgreSQL专属:使用array_position()函数
PostgreSQL里可以借助数组函数来实现同样的效果,写法如下:
select data_Type_Name from data_type where displayName = any(array['groupId','date']) order by array_position(array['groupId','date'], displayName);
这里我们把IN()换成了= any(array[]),然后用array_position()获取每个displayName在目标数组中的位置,以此作为排序依据,结果顺序就和数组里的顺序完全匹配了。
注意事项
- 确保
displayName的取值和你在IN()(或数组)里写的完全一致,包括大小写(如果数据库区分大小写的话),不然排序逻辑会失效。 - 如果IN()里的字段数量很多,专用数据库函数会比CASE语句更简洁高效。
内容的提问来源于stack exchange,提问作者MoNa
相关产品推荐
相关产品推荐

