从表中选择行,并将字段替换为另一列中的一个字段(如果存在)

Ear*_*ind 5 sql postgresql select join substitution

我正在尝试构建一个执行以下操作的PostgreSQL查询,但到目前为止,我的努力一直都是徒劳的.

问题: 有两个表:A和B.我想从表A中选择所有列(具有列:id,name,description),并将"A.name"列替换为"B"列的值.标题"来自表B(具有列:id,table_A_id标题,langcode),其中B.table_A_id是5,而B.langcode是"nl"(如果有任何行).

我的尝试:

SELECT A.name,
 case when exists(select title from B where table_A_id = 5 and langcode= 'nl')
 then B.title
 else A.name
END
FROM A, B
WHERE A.id = 5 and B.table_A_id = 5 and B.langcode = 'nl'

-- second try:
SELECT COALESCE(B.title, A.name) as name
from A, B
where A.id = 5 and B.table_A_id = 5 and exists(select title from B where table_A_id = 5 and langcode= 'nl')
Run Code Online (Sandbox Code Playgroud)

我尝试过使用CASE和COALESCE(),但由于我对这两个概念缺乏经验而失败了.

提前致谢.

leo*_*loy 4

我敢打赌,araqnid 就是您正在寻找的答案。

但是,如果您想强制为每个原始匹配行返回不超过一行A,您可能更愿意执行子选择而不是 LEFT JOIN。例如:

SELECT A.id, COALESCE(
  ( SELECT max(B.title) FROM B WHERE
    langcode = 'nl' AND B.table_a_id = A.id), A.name ) as name
FROM  A
WHERE A.id = 5
Run Code Online (Sandbox Code Playgroud)

如果有多个值,我在这里使用“ max ”来选择任意值。您可以使用“ min ”或任何您认为适合您的情况的值。

也许这比 LEFT JOIN 更容易理解,但是(除了两者不完全等同)JOIN 的性能会比 N 个子选择更好(N 越大越好)。

不管怎样,从学习的角度来看,两者都了解一下还是有好处的。