我有一个没有主键的文件。为了加载文件并执行分析,我想连接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);
我尝试了许多组合,有和没有括号等,我永远无法让它工作!我认为我很接近,但似乎无法使这最后一部分工作 - 有没有人有任何想法?
非常感谢,
标记
答案 0 :(得分:3)
问题是您的update声明错误
您需要SET
,CASE应该是:
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列的更好方法: 只需更改表并添加一个串行列
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