如何将 'where' 过滤器应用于 BigQuery 中的转换列?

How to apply 'where' filter to a transformed column in BigQuery?

我有一列 event_title,其值为:

event_title
2/24/2022 - event foo
2/25/2022 - event bar
event baz

我想将日期字符串解析为日期,并过滤掉没有日期字符串的记录。

我的查询是:

SELECT
    event_title,
    PARSE_DATE('%D', REGEXP_EXTRACT(event_title,r'\d{1,2}\/\d{1,2}\/\d{1,4}')) AS event_date
FROM my_table
WHERE event_date is not null;

预期输出为:

event_title event_date
2/24/2022 - event foo 2/24/2022
2/25/2022 - event bar 2/25/2022

我收到一条错误消息 Unrecognized name: "event_date"

似乎应该可以通过带有别名的转换列进行过滤,我错了吗?对实施此查询的最佳做法有何建议?

列别名在创建 result/output 后可用,而 WHERE 子句用于该输出创建。

所以,显然有很多方法可以重写您的查询 - 下面是一种方法

SELECT
    event_title,
    PARSE_DATE('%m/%d/%Y', REGEXP_EXTRACT(event_title,r'\d{1,2}\/\d{1,2}\/\d{1,4}')) AS event_date
FROM my_table
WHERE REGEXP_CONTAINS(event_title,r'\d{1,2}\/\d{1,2}\/\d{1,4}')    

如果应用于您问题中的示例数据 - 输出为

上面 Mikhail 的回答解释得很好。您也可以使用自己的列作为过滤器:

SELECT
  event_title,
  PARSE_DATE('%D',REGEXP_EXTRACT(event_title,r'\d{1,2}\/\d{1,2}\/\d{1,4}')) AS event_date
FROM my_table
WHERE PARSE_DATE('%D',REGEXP_EXTRACT(event_title,r'\d{1,2}\/\d{1,2}\/\d{1,4}')) IS NOT NULL;

或 CTE:

WITH events AS
  (
     SELECT
       event_title,
       PARSE_DATE('%D',REGEXP_EXTRACT(event_title,r'\d{1,2}\/\d{1,2}\/\d{1,4}')) AS event_date
     FROM my_table
  )

SELECT * FROM events WHERE event_date IS NOT NULL;