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

时间:2015-08-25 15:58:13

标签: sql postgresql

我有一个没有主键的文件。为了加载文件并执行分析,我想连接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);

单独查询

ALTER TABLE members_250815
ADD COLUMN email_id VARCHAR; 

SELECT ARRAY_TO_STRING(ARRAY[emailaddress, id], ' ') AS email_id
FROM members_250815;

似乎按照我的要求工作(即 - 1)创建新列,2)连接2列)但是我的问题似乎是将它们连接在一起。

我做的事真的很蠢吗?我试图研究这几个小时,但我无处可去。基本上我想要实现的任务是:

Create new column on existing table
Concatenate 2 existing columns

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

这可能吗?

非常感谢提前

---更新260815

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

CREATE TABLE members_update AS 
SELECT * FROM members_250815;

ALTER TABLE members_update
   ADD COLUMN email_id VARCHAR;<br/>

UPDATE members_update
SET email_id = email || id;

ALTER TABLE members_update
   ADD COLUMN hashed_primary_key VARCHAR;

UPDATE members_update
SET hashed_primary_key = md5(email_id::VARCHAR);

ALTER TABLE members_update
   ADD CONSTRAINT hashed_primary_key_urn
   PRIMARY KEY (hashed_primary_key);

ANALYSE members_update;

我已经检查过,所有内容都按预期工作,直到添加主键。这是因为事实证明我的电子邮件字段包含许多NULL值,然后将这些值传入email_id和散列列,并停止将散列版本用作PK。

因此我一直在试验IF THEN ELSE和WHERE ELSE语句,如

UPDATE members_update(
   IF email IS NOT NULL
   THEN SET email_id = email || id
   ELSE SET email_id = id
   END IF);

我尝试了许多组合,有和没有括号等,我永远无法让它工作!我认为我很接近,但似乎无法使这最后一部分工作 - 有没有人有任何想法?

非常感谢,

标记

1 个答案:

答案 0 :(得分:3)

问题是您的update声明错误

您需要SETCASE应该是:

ALTER TABLE members_250815
    ADD COLUMN email_id VARCHAR;

UPDATE members_250815
SET email_id = CASE 
                   WHEN email IS NULL THEN id
                   ELSE email || id
               END;

ARRAY_TO_STRING(ARRAY[emailaddress, id], ' ')也可以起作用,但是进一步的研究将是必要的,知道是否比连接字符串更有效。

创建PK列的更好方法: 只需更改表并添加一个串行列

SQL Fiddle Demo

CREATE TABLE members_250815
    ("DMDUNIT" varchar(5), 
     "IND" int)
;

INSERT INTO members_250815 VALUES ('TM001', 1);
INSERT INTO members_250815 VALUES ('TM002', 1);
INSERT INTO members_250815 VALUES ('TM003', 1);

ALTER TABLE members_250815
ADD COLUMN id SERIAL NOT NULL PRIMARY KEY;

有条件的信息

在postgres中更新非常慢。所以在某些情况下最好考虑创建一个新表:

CREATE new_table AS 
    SELECT *, CASE 
                   WHEN email IS NULL THEN id
                   ELSE email || id
              END as email_id
    FROM members_250815

然后

DROP TABLE IF EXITS members_250815;
ALTER TABLE new_table RENAME TO members_250815