将字符串行拆分为多列 - PostgreSQL

问题描述 投票:0回答:1

如何将一列/行拆分为多列和同一行。这个想法是这样的:

我有一个查询,看起来像这样:

SELECT
          i.account_id                               AS account_id,
          c.url_tags                                 AS url_tags,
          CAST(to_char(date_start, 'YYYYMM') AS INT) AS month_id,
          sum(clicks)                                AS clicks,
          sum(impressions)                           AS impressions,
          sum(reach)                                 AS reach,
          sum(spend)                                 AS spend,
          sum(total_actions)                         AS total_actions
        FROM schema.ads_insights               AS i
          INNER JOIN schema.ads as a ON a.id=i.ad_id
          INNER JOIN schema.adcreative as c ON c.id=a.creative__id
        WHERE
          EXTRACT(YEAR FROM date_start) = '2018'
        GROUP BY i.account_id, month_id, c.url_tags

这输出:(删除一些列)

|----||--------------------------------------------------------------||----|
| ID || url                                                          || mo |
|----||--------------------------------------------------------------||----|
| 1  || utm_source=source&utm_medium=medium&utm_term=term            || 12 |
|----||--------------------------------------------------------------||----|
|----||--------------------------------------------------------------||----|
| 2  || utm_source=source2&utm_medium=medium2&utm_term=term2         || 43 |
|----||--------------------------------------------------------------||----|

没有任何后端逻辑我想要的是什么。我们有一个从我们的数据库到可视化平台(Google Data Studio)的连接器,它可以提供数据而无需任何形式来操作选项。这就是为什么我想操纵查询,以便它兼容,没有任何后端代码。

这是我想要的查询结果:

|----||------------||------------||----------||--------|
| ID || utm_source || utm_medium || utm_term ||   mo   |
|----||------------||------------||----------||--------|
| 1  || source     || medium     || term     ||   12   |
|----||------------||------------||----------||--------|
| 2  || source2    || medium2    || term2    ||   43   |
|----||------------||------------||----------||--------|

这可能吗?

sql postgresql split
1个回答
3
投票

使用SUBSTRING

select substring(s from 'utm_source=(.*?)(&|$)') as utm_source,
       substring(s from 'utm_medium=(.*?)(&|$)') as utm_medium,
       substring(s from 'utm_term=(.*?)(&|$)') as utm_term
from t;

Demo

© www.soinside.com 2019 - 2024. All rights reserved.