Eze*_*r K 3 sql-like snowflake-cloud-data-platform
有一个电子邮件域列表,并且想要标记“免费”(如果该域类似于免费域),这对我来说适用于硬编码列表,如下所示:
CASE WHEN lower(email_domain) ilike any ('%%gmail%%','%%yahoo%%', '%%hotmail%%') THEN 'free' else 'business' end
Run Code Online (Sandbox Code Playgroud)
但我真正想做的是从不同表中的列中获取免费域列表,如下所示:
| SUBSTRING_VALUE |
|:------------------|
| "gmail" |
| "hotmail" |
| "yahoo" |
Run Code Online (Sandbox Code Playgroud)
我尝试过使用带有 listagg 或 arrayagg 的子查询,但它不起作用,有什么方法可以做到这一点?
使用JOIN:
SELECT DISTINCT t.*,
CASE WHEN f.domain IS NOT NULL THEN 'free' ELSE 'business' END AS email_type
FROM test t
LEFT JOIN freedomain f
ON t.email_domain ILIKE CONCAT('%', f.domain, '%');
Run Code Online (Sandbox Code Playgroud)
旁注:当使用 ILIKE 时,无需降低 email_domain 列,因为比较已经不区分大小写。
样本:
CREATE OR REPLACE TABLE freedomain
AS
SELECT 'gmail' AS domain
UNION SELECT 'yahoo'
UNION SELECT 'hotmail';
CREATE OR REPLACE TABLE test
AS
SELECT 'biz' AS email_domain
UNION SELECT 'hotmail';
Run Code Online (Sandbox Code Playgroud)
输出:
EMAIL_DOMAIN EMAIL_TYPE
hotmail free
biz business
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |