COPY命令中如何避免匹配NULLIF的数据字符被误转为NULL?
解决方案
当前你的COPY命令中,NULL_IF = '^_'是全局生效的规则,会将所有解析后值为^_的字段统一转为NULL,这就是第三列被转为NULL的原因。要保留第三列的^_同时不影响前两列的转换逻辑,可以通过子查询列转换实现:
COPY INTO "PUBLIC"."T2" ("ID","NAME","DESCR") FROM ( SELECT $1, $2, -- 将被NULL_IF转为NULL的第三列值还原为'^_' CASE WHEN $3 IS NULL THEN '^_' ELSE $3 END AS DESCR FROM '@~/INPUTVIEW/syedtest' ) FILE_FORMAT = ( EMPTY_FIELD_AS_NULL = false NULL_IF = '^_' FIELD_OPTIONALLY_ENCLOSED_BY = '\'' ESCAPE = '\\' ) ON_ERROR = 'ABORT_STATEMENT'
原理说明
- 原
FILE_FORMAT的NULL_IF = '^_'规则依然生效,会正常将第一、二列的^_转为NULL,符合你的需求。 - 通过子查询中的
CASE WHEN语句,针对第三列做特殊处理:将被NULL_IF规则转为NULL的值,重新替换为原始的^_,实现保留目标值的效果。
关于转义失效的原因
你之前尝试用\转义第三列的^_无效,是因为ESCAPE = '\\'的作用仅为转义字段封闭符(即单引号),而非修改NULL_IF的匹配逻辑。即使在^_前添加\,解析后的值会变成\^_,这并不是你想要保留的原始值,因此这种方式无法达到预期效果。
内容的提问来源于stack exchange,提问作者Syed Mudassir Ahmed
相关产品推荐
相关产品推荐

