小编mmT*_*mmR的帖子

Postgres:使用查询输出创建列并更新列值

我有一个没有主键的文件。为了加载文件并执行分析,我想连接 2 个现有列并将输出发送到一个新列。然后我将对这个结果列进行散列并将其用作 PK。

我什至还没有到散列部分,因为我一生都无法弄清楚如何用数据填充我的连接列。

我尝试使用的查询是:

ALTER TABLE members_250815
ADD COLUMN email_id VARCHAR;
UPDATE members_250815
INSERT INTO members_250815(email_id)(
SELECT ARRAY_TO_STRING(ARRAY[emailaddress, id], ' ') AS email_id
FROM members_250815);
Run Code Online (Sandbox Code Playgroud)

作为单独的查询

ALTER TABLE members_250815
ADD COLUMN email_id VARCHAR; 
Run Code Online (Sandbox Code Playgroud)

SELECT ARRAY_TO_STRING(ARRAY[emailaddress, id], ' ') AS email_id
FROM members_250815;
Run Code Online (Sandbox Code Playgroud)

似乎按照我希望的方式工作(即 - 1)创建新列和 2)连接 2 列)但是我的问题似乎是将它们连接在一起。

我真的在做一些愚蠢的事情吗?我试图研究这个几个小时,但我一无所获。基本上,我试图实现的任务是:

Create new column on existing table
Concatenate 2 existing columns
Run Code Online (Sandbox Code Playgroud)

获取连接的结果并使用此数据更新此新列,而不会影响我的任何其他现有数据。

这可能吗?

提前谢谢了

---更新260815

非常感谢您的快速建议,非常感谢!结合你的建议,我已经到了这里:

CREATE TABLE members_update AS 
SELECT * FROM members_250815;

ALTER TABLE members_update
   ADD COLUMN …
Run Code Online (Sandbox Code Playgroud)

sql postgresql

6
推荐指数
1
解决办法
5956
查看次数

在数据中找到不带引号的回车 - 在PostgreSQL中防止COPY FROM

我试图导入一个大的csv文件(~4.5gb)到Postgres但它不断抛出以下错误:

错误:在数据中找到未加引号的回车
提示:使用带引号的CSV字段表示回车.
背景信息:COPY abc_complete_file_261115,第9041959行

我在SublimeText2中打开了我的csv并跳转到9041959行,找到了我需要的记录的URN,将文件加载到Vim并转到该行.我在Vim中启用了隐藏字符(通过使用:set list)所以我希望看到一个回车^ M在数据行的某个地方,但我能找到的唯一一个就是在预期的行尾.

经过一整天的研究并且没有进一步解决这个问题后,我最终删除了第9041959行的记录 - 这并没有解决问题.

然后我想好了也许它在记录之间发生了一些奇怪的事情 - 所以我最终删除了抛出错误的那一行左右的5条记录 - 但它再次给出了同样的错误.(我会担心以后保留数据,现在我只是想导入文件,以便我可以查看Postgres).我确保在重新运行查询之前已将更改保存到csv文件,但它只是给出了相同的错误.

我觉得我错过了一些非常明显的东西 - 有没有人有任何想法可能导致这个问题?

我正在使用运行El Capitan的Mac.

非常感谢

2015年11月27日更新

嗨@JakubKania.很抱歉没有提出查询 - 我不这样做的原因是因为我99.9%确定问题与csv文件而不是查询有关.通用版本是:

CREATE TABLE large_file_test(
urn VARCHAR,
forename CHAR(32),
surname CHAR(32));
COPY large_file_test FROM '/Users/Shared/largefile1.csv' (FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
COPY large_file_test FROM '/Users/Shared/largefile2.csv' (FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
COPY large_file_test FROM '/Users/Shared/largefile3.csv' (FORMAT CSV, DELIMITER ',', HEADER, ENCODING LATIN1);
ALTER TABLE large_file_test
ADD CONSTRAINT large_urn
PRIMARY KEY (large_urn);
ANALYZE large_file_test;
Run Code Online (Sandbox Code Playgroud)

所以我实际上是在尝试将3个单独的文件加载到我创建的表中.问题是第1部分中似乎隐藏的字符阻止它导入Postgres.我还没有尝试过第2或第3部分.

postgresql carriage-return

3
推荐指数
1
解决办法
6351
查看次数

Postgresql NOT NULL AND <> '' vs NOT NULL OR <> ''

我已经阅读了很多关于NOT NULL 与 <>'' 之间区别

我找到的最好的解释是:

https://www.postgresql.org/message-id/AANLkTilEsUTIeUkZCX9Vc14kciFiuvFBRRE-yen4K_Zi@mail.gmail.com其中指出:

NULL 表示问题尚未回答,因此没有答案,一旦提供可能就有答案,因此您不能真正说答案为空。空意味着答案已经给出,答案是空的。

对于我正在处理的表,我试图过滤有效邮政编码的结果(邮政编码是此特定表中的 VARCHAR),我尝试了以下操作:

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR postcode <> '';
Run Code Online (Sandbox Code Playgroud)

但是,这在我的结果中给出了一些空白邮政编码。打破这个...

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

给出一些空白邮政编码,而

SELECT postcode FROM customer_table_1 
WHERE postcode <>'';
Run Code Online (Sandbox Code Playgroud)

只在结果中给出有效的邮政编码。因此,查询的 IS NOT NULL 部分没有做我认为的那样。

作为更复杂查询的一部分,我以前使用过:

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL AND postcode <> '';
Run Code Online (Sandbox Code Playgroud)

并达到了预期的效果。不过我一直觉得应该是

SELECT postcode FROM customer_table_1 
WHERE postcode IS NOT NULL OR …
Run Code Online (Sandbox Code Playgroud)

postgresql null logical-operators comparison-operators

0
推荐指数
1
解决办法
9322
查看次数