You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres使用COPY导入CSV时如何将多值设为NULL?

解决PostgreSQL COPY命令多值转NULL的问题

PostgreSQL的COPY命令的NULL AS参数仅支持指定单一固定字符串,无法直接匹配多个目标值,也不支持正则表达式,这就是你原来的代码无法生效的原因。针对你的需求,推荐两种可行方案:

方案一:临时表中转(高效推荐)

先将数据导入临时表处理默认的\N标记,再通过字段转换将指定值转为NULL后插入正式表:

  1. 创建临时表(结构与正式表一致)
CREATE TEMP TABLE temp_title_basics
(
    tconst VARCHAR,
    titleType TEXT,
    primaryTitle VARCHAR,
    originalTitle VARCHAR,
    isAdult INT,
    startYear SMALLINT,
    endYear SMALLINT,
    runtimeminutes SMALLINT,
    genres VARCHAR
);
  1. 用COPY导入数据,先处理IMDB默认的\N为NULL
COPY temp_title_basics
FROM '-- 替换为你的文件路径 --'
DELIMITER ',' NULL AS '\N' CSV HEADER;
  1. 插入正式表时转换指定值为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语句批量转换指定值:

  1. 导入数据(处理\N为NULL)
COPY title_basics
FROM '-- 替换为你的文件路径 --'
DELIMITER ',' NULL AS '\N' CSV HEADER;
  1. 更新指定字段的目标值为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:55:20