SAS转PostgreSQL代码翻译求助:解析并转换指定SAS代码
SAS转PostgreSQL代码分析与正确实现
原SAS代码逻辑拆解
原SAS代码的核心逻辑是:
- 创建新表
fc_action_v1 - 继承源表
action_targets的所有字段 - 新增字段
Region_mod,值为region字段的大写转换结果 - 将源字段
2nd_Item_nr重命名为Prodnumber(替换原字段名,不会保留原字段)
你给出的两个SQL的问题
- 第一个SQL完全错误:
- 语法错误:PostgreSQL中不存在
create table data ...的写法,多余了data关键字 - 逻辑错误:仅选择两个字段,且错误地将新增字段
Region_mod反向命名为region,完全偏离原SAS代码的逻辑
- 语法错误:PostgreSQL中不存在
- 第二个SQL存在问题:
- 语法错误:同样多余了
data关键字 - 逻辑错误:
select *会保留原2nd_Item_nr字段,加上2nd_item_nr as prodnumber会导致结果中同时存在原字段和重命名后的字段,不符合SAS中rename替换原字段的逻辑 - 字段生成错误:错误地将
region_mod映射为region,实际应该是用原region生成大写的Region_mod
- 语法错误:同样多余了
正确的PostgreSQL代码
方式一(PostgreSQL 12+支持,推荐)
利用EXCLUDE关键字排除原字段,避免重复:
CREATE TABLE fc_action_v1 AS SELECT *, UPPER(region) AS Region_mod, "2nd_Item_nr" AS Prodnumber EXCLUDE ("2nd_Item_nr") FROM action_targets;
方式二(兼容所有PostgreSQL版本)
如果你的PostgreSQL版本不支持EXCLUDE,可以显式列出除2nd_Item_nr外的所有源字段:
CREATE TABLE fc_action_v1 AS SELECT -- 替换为action_targets表中除2nd_Item_nr外的所有字段,示例如下 region, other_field1, other_field2, -- 新增大写转换后的字段 UPPER(region) AS Region_mod, -- 重命名目标字段 "2nd_Item_nr" AS Prodnumber FROM action_targets;
注意:如果源表字段在PostgreSQL中是小写形式(如
2nd_item_nr),需要对应调整双引号内的字段名,确保与实际表结构匹配。
内容的提问来源于stack exchange,提问作者Awesome
相关产品推荐
相关产品推荐

