如何将 '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;
我有一列 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;