[PostgreSQL]COPYコマンドでNULLを扱う

PostgreSQL の COPY コマンドでデータインポートする際に、 NULL を扱う方法をメモ。
元データのフォーマットは TSV と CSV を想定。

データ投入先のテーブル

次のテーブルを考える。
各カラムは not null

create table t(
    id integer,
    name text

);

postgres=# \d t
       Table "public.t"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer |
 name   | text    |

COPY コマンドのシンタックス

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

TSV format

COPY コマンドで元データにファイルを指定した場合、デリミターはデフォルトではタブ。
TSV では

  • 空文字は空文字
  • NULL \N

で表す。

インポートするデータ

インポートデータには

  • 普通のデータ
  • 空文字
  • \N

の3種類を用意

1    food
2	energy
3	
4	\N

データをインポート

postgres=# copy t(id, name) from '/tmp/data.tsv';
COPY 4
postgres=# select id , name, length(name) from t;
 id |  name  | length
----+--------+--------
  1 | food   |      4
  2 | energy |      6
  3 |        |      0
  4 |        |
(4 rows)

NULL \N から別の文字に変えたい場合は、次のようにオプションを指定する。

postgres=# copy t(id, name) from '/tmp/data.tsv' (null ''); 
COPY 4
postgres=# select id , name, length(name) from t;
 id |  name  | length
----+--------+--------
  1 | food   |      4
  2 | energy |      6
  3 |        |
  4 | N      |      1
(4 rows)

copy t(id, name) from '/tmp/data.tsv' with null as ''; でも OK

CSV format

CSV では

  • 空文字はダブルクオート("")
  • NULL は空文字

で表す。

デリミターがデフォルトの TAB と異なるため、明示的に CSV と指定する。

インポートするデータ

インポートデータには

  • 普通のデータ
  • シングルクオート
  • ダブルクオート
  • 空文字

の4種類を用意

1,food
2,energy
3,''
4,""
5,

データをインポート

postgres=# copy t(id, name) from '/tmp/data.csv' (format csv) ;
COPY 5
postgres=# select id , name, length(name) from t;
 id |  name  | length
----+--------+--------
  1 | food   |      4
  2 | energy |      6
  3 | ''     |      2
  4 |        |      0
  5 |        |
(5 rows)

インポートのバリエーションとして、NULL で取り込まれている空文字も空文字で取り込みたい場合、 force_not_null オプションを利用する。

The CSV format has no standard way to distinguish a NULL value from an empty string. PostgreSQL’s COPY handles this by quoting. A NULL is output as the NULL parameter string and is not quoted, while a non-NULL value matching the NULL parameter string is quoted. For example, with the default settings, a NULL is written as an unquoted empty string, while an empty string data value is written with double quotes (“”). Reading values follows similar rules. You can use FORCE_NOT_NULL to prevent NULL input comparisons for specific columns.

postgres=# copy t(id, name) from '/tmp/data.csv' (format csv, force_not_null(name)) ;
COPY 5
postgres=# select id , name, length(name) from t;
 id |  name  | length
----+--------+--------
  1 | food   |      4
  2 | energy |      6
  3 | ''     |      2
  4 |        |      0
  5 |        |      0
(5 rows)

References

Advertisements
Tagged with: ,
Posted in database

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: