如何让Redshift查询结果与IN子句中的ID顺序一致?
让查询结果与IN子句顺序一致的方法
默认情况下,SQL的SELECT语句返回的结果是无序的,除非显式指定ORDER BY子句。要让结果和IN子句中的id顺序保持一致,需要通过ORDER BY结合对应数据库的函数或语法实现,以下是主流数据库的实现方式:
MySQL/MariaDB
使用FIELD()函数,该函数会返回目标值在参数列表中的位置,以此作为排序依据:
SELECT * FROM table WHERE id IN (3,1,2,4) ORDER BY FIELD(id, 3,1,2,4);
PostgreSQL
方法1(9.5+版本推荐)
使用array_position()函数,配合数组来指定顺序:
SELECT * FROM table WHERE id = ANY(ARRAY[3,1,2,4]) ORDER BY array_position(ARRAY[3,1,2,4], id);
方法2(兼容旧版本)
通过字符串拼接+POSITION()函数实现:
SELECT * FROM table WHERE id IN (3,1,2,4) ORDER BY POSITION(','||id||',' IN ',3,1,2,4,');
SQL Server
方法1(通用兼容所有版本)
用CASE语句为每个id指定排序优先级:
SELECT * FROM table WHERE id IN (3,1,2,4) ORDER BY CASE id WHEN 3 THEN 1 WHEN 1 THEN 2 WHEN 2 THEN 3 WHEN 4 THEN 4 END;
方法2(2022+版本支持)
借助STRING_SPLIT()的ordinal列(保留分割后的顺序):
SELECT t.* FROM table t JOIN STRING_SPLIT('3,1,2,4', ',', 1) s ON t.id = CAST(s.value AS INT) ORDER BY s.ordinal;
注意事项
如果IN子句中的元素数量较多,上述直接写函数或CASE的方式会比较繁琐,可以考虑创建临时表/表变量,存储带排序序号的id列表,再通过关联查询实现排序。
内容的提问来源于stack exchange,提问作者Rostricalv
相关产品推荐
相关产品推荐

