如何通过PostgreSQL的SELECT和WHERE IN查询仅返回值数组?
问题说明
我有一张名为orders的表,结构如下:
| id | value | price | amount |
|---|---|---|---|
| 2 | 'orange' | $12 | 7 |
| 8 | 'yellow' | $14 | 29 |
| 5 | 'green' | $17 | 9 |
我需要执行带WHERE IN子句的SELECT查询,原SQL语句为:
SELECT value FROM orders WHERE id IN (2, 5);
对应的Knex.js代码:
knex('orders') .select('value') .whereIn('id', [2, 5])
当前返回的是对象数组:
[{value: 'orange'}, {value: 'green'}]
请问如何使用PostgreSQL语法仅返回值数组:
['orange', 'green']
解决方案
1. PostgreSQL原生SQL实现
使用PostgreSQL内置的array_agg()聚合函数,直接将查询结果聚合为数组:
SELECT array_agg(value) FROM orders WHERE id IN (2, 5);
如果需要保证返回数组的元素顺序和IN子句中的id顺序一致,可以添加排序规则:
SELECT array_agg(value ORDER BY id) FROM orders WHERE id IN (2, 5);
2. Knex.js适配实现
在Knex中通过raw()方法调用PostgreSQL的聚合函数,代码示例:
knex('orders') .select(knex.raw('array_agg(value) as values_array')) .whereIn('id', [2, 5]) .then(result => { const values = result[0].values_array; console.log(values); // 输出 ['orange', 'green'] });
若需要按id顺序排列结果:
knex('orders') .select(knex.raw('array_agg(value ORDER BY id) as values_array')) .whereIn('id', [2, 5]) .then(result => { const values = result[0].values_array; console.log(values); });
内容的提问来源于stack exchange,提问作者TwittorDrive
相关产品推荐
相关产品推荐

