使用Postgres:在另一个表中的数据上创建一个二进制数据列

时间:2013-08-16 23:18:14

标签: sql postgresql conditional alter

我有一张表,其中列有唯一ID和描述这些ID特征的数据列。它采取以下形式:

ID  Tall  Funny  Weight
1   1      0     200
2   0      0     180
3   1      1     250

等等。我有另一张桌子,它只是一张具有特征的人的身份列表,例如收入超过10万。

Rich
1 
3 

我想要做的是在第一个表中创建一个列,如果它们在第二个表中则为1,否则为0。我可以在R中这样做:

TableA$Rich <- TableA$ID %in% TableB

但它的速度非常慢,如果没有其他原因,因为我的postgres(ParAccel / PaDB)集群拥有的资源比我可以运行R的资源更多。你能帮助我完成这个吗?

我尝试做左外连接,比如......

create table c as(select a.id, tall, funny, weight,b.id as rich
from tablea a
left outer join tableb b 
on a.id = b.id);

但它产生了意想不到的结果。它给了我

ID  Tall  Funny  Weight  Rich
1   1      0     200     1
2   0      0     180     2
3   1      1     250     3

即使它应该是“1,NULL,3”,我也更喜欢1和0。我担心这可能是数据错误,但数据看起来是正确的。我在case语句中尝试了同样的事情并获得了相同的结果,但对于Rich的所有值都使用了“TRUE”。

2 个答案:

答案 0 :(得分:2)

case语句解决了您的问题:

create table c as
    select a.id, tall, funny, weight,
           (case when b.id is null then 0 else 1 end) as rich
    from tablea a left outer join
         tableb b
         on a.id = b.id;

答案 1 :(得分:1)

select
    a.id, tall, funny, weight,
    (b.id is not null)::integer as rich
from
    tablea a
    left outer join
    tableb b on a.id = b.id