Postgres使用COPY导入CSV时如何将多值设为NULL?
解决PostgreSQL COPY命令多值转NULL的问题
PostgreSQL的COPY命令的NULL AS参数仅支持指定单一固定字符串,无法直接匹配多个目标值,也不支持正则表达式,这就是你原来的代码无法生效的原因。针对你的需求,推荐两种可行方案:
方案一:临时表中转(高效推荐)
先将数据导入临时表处理默认的\N标记,再通过字段转换将指定值转为NULL后插入正式表:
- 创建临时表(结构与正式表一致)
CREATE TEMP TABLE temp_title_basics ( tconst VARCHAR, titleType TEXT, primaryTitle VARCHAR, originalTitle VARCHAR, isAdult INT, startYear SMALLINT, endYear SMALLINT, runtimeminutes SMALLINT, genres VARCHAR );
- 用
COPY导入数据,先处理IMDB默认的\N为NULL
COPY temp_title_basics FROM '-- 替换为你的文件路径 --' DELIMITER ',' NULL AS '\N' CSV HEADER;
- 插入正式表时转换指定值为NULL
INSERT INTO title_basics SELECT tconst, -- 将titleType中的'Reality-Tv'转为NULL CASE WHEN titleType = 'Reality-Tv' THEN NULL ELSE titleType END, primaryTitle, originalTitle, isAdult, startYear, endYear, runtimeminutes, -- 将genres中的'Animation, Action, Fantasy'转为NULL CASE WHEN genres = 'Animation, Action, Fantasy' THEN NULL ELSE genres END FROM temp_title_basics;
如果需要处理更多字段的特定值,只需在SELECT中对应添加CASE逻辑即可。
方案二:导入后直接更新(适合小数据量)
先完成基础数据导入,再通过UPDATE语句批量转换指定值:
- 导入数据(处理
\N为NULL)
COPY title_basics FROM '-- 替换为你的文件路径 --' DELIMITER ',' NULL AS '\N' CSV HEADER;
- 更新指定字段的目标值为NULL
-- 处理titleType字段的'Reality-Tv' UPDATE title_basics SET titleType = NULL WHERE titleType = 'Reality-Tv'; -- 处理genres字段的'Animation, Action, Fantasy' UPDATE title_basics SET genres = NULL WHERE genres = 'Animation, Action, Fantasy';
这种方式操作简单,但数据量较大时,临时表方案的性能更优。
内容的提问来源于stack exchange,提问作者creative0101
相关产品推荐
相关产品推荐

