Postgres:需要选择关键字作为单独的数组值

时间:2016-11-08 04:01:26

标签: arrays postgresql

数据类型:

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)",但它只是将所有关键字组合到一个数组的单个口袋中。

2 个答案:

答案 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()的数组。