数据类型:
id: int4
keywords: text
objectivable_id: int4
Postgres版本:PostgreSQL 9.5.3
Business_objectives表:
id keywords objectivable_id
1 keyword1a,keyword1b,keyword1c 6
2 keyword2a 6
3 testing 5
目前我使用的查询是:
select array(select b.keywords from business_objectives b where b.objectivable_id = 6)
选择匹配的objectivable_id的关键字为:
{"keyword1a,keyword1b,keyword1c","keyword2a"}
在这里,我希望结果是:
{"keyword1a","keyword1b","keyword1c","keyword2a"}
我尝试使用" string_agg(text,delimiter)",但它只是将所有关键字组合到一个数组的单个口袋中。
答案 0 :(得分:1)
所以这样的事情可以给你预期的结果:
SELECT array_agg( j.keys )
FROM business_objectives b,
LATERAL ( SELECT k
FROM unnest ( string_to_array( b.keywords, ',' ) ) u( k )
) j( keys )
WHERE b.objectivable_id = 6;
array_agg
-------------------------------------------
{keyword1a,keyword1b,keyword1c,keyword2a}
(1 row)
使用LATERAL部分,我们查看外部查询以创建新视图。只需将关键字拆分为一组行,然后将这些行提供给 array_agg()函数。
详情了解LATERAL:https://www.postgresql.org/docs/9.6/static/queries-table-expressions.html#QUERIES-LATERAL
答案 1 :(得分:1)
你可以简单地(而且便宜!)使用:
SELECT string_to_array(string_agg(keywords, ','), ',')
FROM business_objectives
WHERE objectivable_id = 6;
将逗号分隔的列表与string_agg()
连接起来,然后将完整文本转换为string_to_array()
的数组。