выберите строку из таблицы и замените полем с одним из другого столбца, если это существует

Я пробую, создают запрос PostgreSQL, который делает следующее, но до сих пор мои усилия были напрасно.

Проблема: существует две таблицы: A и B. Я хотел бы выбрать все столбцы из таблицы A (имеющий столбцы: идентификатор, имя, описание) и замена столбец "A.name" со значением столбца "B.title" от таблицы B (имеющий столбцы: идентификатор, 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')

Я попытался использовать СЛУЧАЙ и ОБЪЕДИНЯЮ (), но отказавший из-за моей неопытности с обоими понятиями.

Заранее спасибо.

5
задан EarthMind 9 June 2010 в 15:12
поделиться

4 ответа

araqnid's - это тот ответ, который вы ищете, я уверен.

Но если вы хотите обеспечить возврат не более одной строки для каждого исходного совпадающего 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 велико).

В любом случае, с точки зрения обучения, полезно понимать и то, и другое.

4
ответ дан 14 December 2019 в 08:42
поделиться
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
2
ответ дан 14 December 2019 в 08:42
поделиться

Попробуйте это

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'
0
ответ дан 14 December 2019 в 08:42
поделиться

Хорошо, я не уверен, как ваши таблицы должны быть соединены, но что-то вроде этого должно сработать:

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'
1
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: