SQL中如何基于数组输入编写WHERE条件并返回对应结果数组
方案说明
1. WHERE条件编写
标准SQL场景下直接用IN运算符即可,把待查询的ID列表放在IN后的括号中:
WHERE id IN (1,4,7)
如果是传入数组参数的场景,不同数据库的适配写法略有区别:
- PostgreSQL:用
= ANY匹配数组元素:WHERE id = ANY('{1,4,7}'::int[]) - MySQL:用
FIND_IN_SET函数匹配:WHERE FIND_IN_SET(id, '1,4,7') > 0 - SQL Server:用
OPENJSON解析数组后匹配:WHERE id IN (SELECT value FROM OPENJSON('[1,4,7]'))
2. 实现返回与输入ID顺序对应的姓名数组
注意:直接用IN查询返回的结果顺序不一定和输入ID顺序一致,要保证一一对应,需要额外指定排序逻辑再聚合为数组,不同数据库的实现示例如下:
PostgreSQL示例
SELECT ARRAY_AGG(name ORDER BY array_position('{1,4,7}'::int[], id)) AS name_arr FROM person WHERE id = ANY('{1,4,7}'::int[]);
用array_position获取ID在输入数组中的位置,按该位置排序后用ARRAY_AGG聚合成数组,最终返回的数组顺序和输入ID完全对应。
MySQL示例
SELECT JSON_ARRAYAGG(name ORDER BY FIELD(id,1,4,7)) AS name_arr FROM person WHERE id IN (1,4,7);
用FIELD函数指定ID的排序规则,再用JSON_ARRAYAGG聚合为JSON数组格式。
SQL Server示例
-- SQL Server 2022及以上版本可用JSON_ARRAYAGG SELECT JSON_ARRAYAGG(name ORDER BY CHARINDEX(','+CAST(id AS VARCHAR)+',', ',1,4,7,')) AS name_arr FROM person WHERE id IN (1,4,7);
补充说明:如果需要兼容ID匹配不到的场景、保留数组对应位置填充空值,可以把输入数组拆分为行后和人员表做左关联,再聚合就能保证返回数组长度和输入ID数组完全一致。
内容的提问来源于stack exchange,提问作者IrinaB
相关产品推荐
相关产品推荐

