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
但我真正想做的是从不同表中的列中获取免费域列表,如下所示:
| SUBSTRING_VALUE   |
|:------------------|
| "gmail"           |
| "hotmail"         |
| "yahoo"           |
我尝试过使用带有 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, '%'); 
旁注:当使用 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';
输出:
EMAIL_DOMAIN    EMAIL_TYPE
hotmail         free
biz             business
| 归档时间: | 
 | 
| 查看次数: | 1264 次 | 
| 最近记录: |