我有一个没有主键的文件。为了加载文件并执行分析,我想连接 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) 我试图导入一个大的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部分.
我已经阅读了很多关于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)