理解SAS Proc SQL中的CASE语句及PostgreSQL转换咨询
SAS代码含义解析与PostgreSQL转换
一、SAS Proc SQL代码含义
这段代码是SAS中从两个表按条件取数的逻辑,拆解关键点:
"LIITM"n/"LIMCU"n:SAS的命名字面量,用来引用大小写敏感或含特殊字符的列,作用等价于其他SQL里用双引号包裹列名。when 列名:SAS SQL的简化写法,等同于when 列名 is not missing,即判断该列是否为非缺失值(SAS数值型缺失为.,字符型为'')。- 第一个CASE逻辑:优先取
DM_TURNOVER_TMP_STOCK表的LIITM列值,若该列缺失,则取DM_TURNOVER_TMP_SALES表的SDITM列值,最终输出列名为LIITM。 - 原代码第二个CASE语句不完整,推测完整逻辑是:优先取
DM_TURNOVER_TMP_STOCK表的LIMCU列值,缺失则取DM_TURNOVER_TMP_SALES表对应列(比如SDMCU)的值,输出列名为LIMCU。
二、转换为PostgreSQL语法
PostgreSQL用双引号引用大小写敏感列,空值判断用is not null,转换后的完整代码如下(补全了第二个CASE逻辑及必要的表关联部分):
SELECT CASE WHEN DM_TURNOVER_TMP_STOCK."LIITM" IS NOT NULL THEN DM_TURNOVER_TMP_STOCK."LIITM" ELSE DM_TURNOVER_TMP_SALES."SDITM" END AS "LIITM", CASE WHEN DM_TURNOVER_TMP_STOCK."LIMCU" IS NOT NULL THEN DM_TURNOVER_TMP_STOCK."LIMCU" ELSE DM_TURNOVER_TMP_SALES."SDMCU" -- 若销售表对应列不是SDMCU,可根据实际调整 END AS "LIMCU" FROM DM_TURNOVER_TMP_STOCK JOIN DM_TURNOVER_TMP_SALES ON -- 需补充两个表的关联条件,比如唯一匹配键 DM_TURNOVER_TMP_STOCK.关联键 = DM_TURNOVER_TMP_SALES.关联键;
补充说明
- 如果列名无需大小写敏感,可去掉双引号,PostgreSQL会自动将列名转为小写。
- 原SAS代码缺少
FROM和表关联逻辑,转换时必须补充关联条件,否则会产生笛卡尔积。
内容的提问来源于stack exchange,提问作者Awesome
相关产品推荐
相关产品推荐

