我有此代码:
CASE WHEN url LIKE 'utm_medium'
THEN
SPLIT_PART( -- slice UTM from URL
SPLIT_PART(pageviews.url,'utm_medium=',2)
,'&',1
)
ELSE NULL END AS utm_medium,
CASE
WHEN utm_medium = 'paidsocial'
THEN channel = 'Paid Social'
WHEN utm_medium = 'email'
THEN channel = 'Email'
END
在第一个案例中,我从URL中提取utm_medium
参数作为utm_medium
列,在第二个案例中,我想基于channel
创建另一列utm_medium
值。
我遇到错误:
column "utm_medium" does not exist
LINE 153: WHEN utm_medium = 'paidsocial'
创建utm_medium列后是否可以查询?
答案 0 :(得分:1)
split_part()
建议使用Postgres,它支持横向连接。这些允许您在FROM
子句中定义别名,而无需使用子查询或CTE。那应该是:
SELECT pv.*, v.utm_medium,
(CASE WHEN utm_medium = 'paidsocial' THEN channel = 'Paid Social'
WHEN utm_medium = 'email' THEN channel = 'Email'
END)
FROM pageviews pv CROSS JOIN LATERAL
(VALUES (CASE WHEN url LIKE 'utm_medium'
THEN SPLIT_PART(SPLIT_PART(pv.url, 'utm_medium=', 2
), '&', 1
)
)
) v(utm_medium)
答案 1 :(得分:0)
utm_medium
列创建后是否可以查询?
很有可能不会。
某些引擎可能支持您所需的此非标准SQL功能。您没有提及正在使用哪个数据库,因此不清楚。
通常的解决方案是使用表表达式或CTE生成具有您想要的名称的善意列。
例如:
select
col1,
col2,
CASE
WHEN utm_medium = 'paidsocial'
THEN channel = 'Paid Social'
WHEN utm_medium = 'email'
THEN channel = 'Email'
END
from (
select
col1,
col2,
CASE WHEN url LIKE 'utm_medium'
THEN
SPLIT_PART( -- slice UTM from URL
SPLIT_PART(pageviews.url,'utm_medium=',2)
,'&',1
)
ELSE NULL
END AS utm_medium
from my_table
) x
该示例实际上将在所有数据库上运行。如您所见,在x
子句中使用了表表达式FROM
,在其中有效地定义了名为utm_medium
的列。然后,主查询可以立即使用此列。