5

我正在尝试构建一个执行以下操作的 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')

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

提前致谢。

4

4 回答 4

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

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

也许这比 LEFT JOIN 更容易理解,但是(除了两者不完全等价之外)JOIN 将比 N 个子选择执行得更好(更好的是 N 很大)。

无论如何,从学习的角度来看,两者都了解是很好的。

于 2010-06-09T16:47:33.480 回答
2
select A.id, coalesce(B.title, A.name)
from TableA AS A
     left join (select table_a_id, title from TableB where langcode = 'nl') AS B
       on B.table_a_id = A.id
WHERE A.id = 5
于 2010-06-09T15:28:19.487 回答
1

好的,我不确定您的表必须如何连接,但是这样的事情应该可以完成:

SELECT            yourcolumnlist,
                  CASE WHEN A.name IS NULL THEN B.title ELSE A.name END
FROM              TableA AS A
INNER JOIN        TableB AS B
ON                A.id = B.table_A_id
WHERE             B.table_A_id = 5
AND               B.langcode = 'nl'

另一种方法是使用 COALESCE() 函数:

SELECT            yourcolumnlist,
                  COALESCE(A.name, B.title)
FROM              TableA AS A
INNER JOIN        TableB AS B
ON                A.id = B.table_A_id
WHERE             B.table_A_id = 5
AND               B.langcode = 'nl'
于 2010-06-09T13:54:48.367 回答
0

试试这个

select A.id,B.title,A.description from TableA as A inner join tableB as B
on A.id=B.id where B.table_A_id = 5 and B.langcode ='nl'
于 2010-06-09T13:53:33.670 回答