对不同表中的列中的值使用 ILIKE ANY

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 的子查询,但它不起作用,有什么方法可以做到这一点?

Luk*_*zda 5

使用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)