在SAS Enterprise Guide中通过SQL添加邮箱域名筛选列的方法
在SAS Enterprise Guide中新增Email Domain列并映射域名显示值的SQL实现
针对你需要从表A的Email字段提取域名,并转换为友好名称(如gmail.com对应Gmail)新增为Email Domain列的需求,这里提供两种实用的SQL实现方案,适配不同的场景:
方法一:直接使用CASE WHEN映射(适合域名数量较少的情况)
这种方法无需额外创建映射表,直接在查询中通过字符串函数提取域名,再用条件判断返回对应名称:
PROC SQL; -- 若不想覆盖原表,可将表名改为表A_Updated之类的新名称 CREATE TABLE 表A AS SELECT Cust_Name, Email, CASE -- 提取@后的域名部分,匹配后返回对应显示名 WHEN scan(Email, 2, '@') = 'gmail.com' THEN 'Gmail' WHEN scan(Email, 2, '@') = 'yahoo.com' THEN 'Yahoo' WHEN scan(Email, 2, '@') = 'sfr.fr' THEN 'SFR' ELSE 'Other' -- 处理未匹配到的其他域名,避免空值 END AS Email_Domain FROM 表A; QUIT;
关键部分解释:
scan(Email, 2, '@'):SAS的字符串函数,以@为分隔符,提取Email字段的第2部分(也就是@之后的域名)CASE WHEN:根据提取到的域名进行条件匹配,返回你想要的友好名称;ELSE分支可以确保所有记录都有值,不会出现空的Email Domain
如果你的邮箱格式可能存在特殊情况(比如极少数包含多个@的邮箱),可以改用substr+index组合来更精准地提取域名:
-- 替换原来的scan函数即可 substr(Email, index(Email, '@') + 1)
方法二:使用映射表关联(适合域名数量较多或需要频繁维护的场景)
如果后续需要新增更多域名映射,直接修改CASE WHEN会比较繁琐,建议先创建一个域名映射表,再通过JOIN关联实现:
步骤1:创建域名映射表
PROC SQL; CREATE TABLE Domain_Map AS SELECT 'gmail.com' AS Domain, 'Gmail' AS Domain_Name FROM dual UNION ALL SELECT 'yahoo.com' AS Domain, 'Yahoo' AS Domain_Name FROM dual UNION ALL SELECT 'sfr.fr' AS Domain, 'SFR' AS Domain_Name FROM dual; QUIT;
(注:如果是SAS 9.4及以上版本,也可以用VALUES子句来创建映射表,写法更简洁)
步骤2:关联原表与映射表
PROC SQL; CREATE TABLE 表A AS SELECT a.Cust_Name, a.Email, -- 若没有匹配的域名,返回'Other' COALESCE(b.Domain_Name, 'Other') AS Email_Domain FROM 表A a -- 左连接确保原表所有记录都被保留 LEFT JOIN Domain_Map b ON substr(a.Email, index(a.Email, '@') + 1) = b.Domain; QUIT;
优势:
后续新增或修改域名映射时,只需要更新Domain_Map表即可,不需要修改主查询语句,维护起来更高效。
内容的提问来源于stack exchange,提问作者tarradou
相关产品推荐
相关产品推荐

