postgres复制到hstore字段,值中有双引号

tct7dpnv  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(328)

我已经尝试了几个小时,从一个csv文件填充postgres12数据库使用 COPY 命令。这张table有一张table hstore 字段和其中一个键值对具有双引号 " 在价值观上。
postgres数据库是这样创建的

CREATE TABLE test ( 
    title VARCHAR(20),
    tags hstore
);

csv文件使用 tabs 作为分隔符,如下所示

My Title | name=>"""Paul "Butch" Newman""", job=>actor

name值需要双引号和转义,因为它包含空格。 | 表示一个制表符。
我的导入语句如下所示:

COPY test (title, tags) 
FROM '/var/lib/postgresql/data/test.csv'
DELIMITER E'\t' CSV ENCODING 'UTF8';

数据库按预期填充,但当我用 SELECT tags->'name' as name FROM test; pgadmin 4返回 Paul Butch Newman 而不是 Paul "Butch" Newman 我的问题是如何将双引号转换成实际的hstore值?
我发现了许多关于导入文本字段的双引号的答案。但这里的输入是一个 hstore 字段和值需要在此处双引号,因为它包含空格。
谢谢!

fquxozlt

fquxozlt1#

我只是在本地玩的。
我假设您可以控制输入文件的格式。
问题是csv格式转换为 "" 在用双引号括起来的元素中找到 " 当你把它们传出去的时候。
这让我得到了你想要的结果:

My Title | name=>"""Paul \""Butch\"" Newman""", job=>actor

一旦csv处理程序通过将双引号转换为单引号完成转义,它就会通过 name=>"Paul \"Butch\" Newman", job=>actorinsert ,这是如何在psql或pgadmin中将其作为文本编写的。

select tags->'name' as name
  from test_hstor;

        name         
---------------------
 Paul "Butch" Newman
(1 row)

出于好奇,我选择将其作为文本而不是csv导入,并且输入记录必须包含 name=>"Paul \\"Butch\\" Newman", job=>actor 工作正常。

相关问题