Postgresql 基于existense动态选择不同表中的字段

Postgresql 基于existense动态选择不同表中的字段,postgresql,Postgresql,我有两张桌子A和B 两个表的列数相同 表A始终包含表B的所有ID 需要首先从表B中获取行,如果它不存在,则具有 从表A中取出 我试着动态地做这件事 select CASE WHEN b.id is null THEN a.* ELSE b.* END from A a left join B b on b.id = a.id 我认为这种语法是不正确的 有人可以建议如何继续。看起来您希望从表A中选择所有列,但

我有两张桌子A和B

  • 两个表的列数相同
  • 表A始终包含表B的所有ID
  • 需要首先从表B中获取行,如果它不存在,则具有 从表A中取出
  • 我试着动态地做这件事

    select 
          CASE
          WHEN b.id is null THEN
             a.*
          ELSE
             b.*
          END
    from A a
    left join B b on b.id = a.id 
    
    我认为这种语法是不正确的


    有人可以建议如何继续。

    看起来您希望从表A中选择所有列,但表B中存在匹配ID时除外。在这种情况下,您希望从表B中选择所有列

    只要两个表中列的数量和类型兼容,就可以使用此查询完成此操作:

    select * from a where not exists (select 1 from b where b.id = a.id)
    union all
    select * from b
    

    如果列的数量、类型或顺序不同,则需要明确指定每个子查询中要返回的列。

    您的想法是正确的。您不能使用
    *
    但是,您必须列出它自己的
    大小写表达式中的每一列。另外,您可以使用
    COALESCE()
    而不是
    CASE
    一样选择COALESCE(a.id,b.id)作为id,COALESCE(a.foo,b.foo)作为foo,COALESCE(a.bar,b.bar)作为bar从a左连接到b,b.id=a.id
    @JNevill。谢谢你的留言。有没有更好的方法来代替逐个字段检查?太棒了。这就是我要找的。非常有用。