5

次のことを行う PostgreSQL クエリを作成しようとしていますが、これまでの努力は無駄でした。

問題: A と B の 2 つのテーブルがあります。テーブル A からすべての列 (列: id、name、description) を選択し、"A.name" 列を列 "B.テーブル B の title" (列: id、table_A_id title、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はあなたが探している答えです、きっと。

ただし、元の一致する行ごとに1行しか返されAないようにする場合は、LEFTJOINではなく副選択を実行することをお勧めします。例えば:

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よりも理解しやすいですが、(2つが完全に同等ではないことを除けば)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 に答える