在CASE语句之前创建的查询列-“列不存在”

时间:2020-04-08 10:28:55

标签: sql postgresql case

我有此代码:

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列后是否可以查询?

2 个答案:

答案 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的列。然后,主查询可以立即使用此列。