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

StackOverflow https://stackoverflow.com/questions/3006415

Вопрос

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

Проблема:Есть две таблицы: A и B. Я хотел бы выбрать все столбцы из таблицы A (имеющие столбцы: ID, имя, описание) и замените столбец «А.Нам» со значением столбца «B.Title» От таблицы B (имеющие столбцы: id, it_a_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')

Я пытался использовать случай и объединять (), но не удалось из-за моего неопыта с обеими концепциями.

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

Это было полезно?

Решение

Аракнид - это ответ, который вы ищете, держу пари.

Но если вы хотите обеспечить принуждение того, что для каждого оригинального соответствия возвращаются не более одного ряда A Строка, вы можете предпочесть сделать подселение вместо левого присоединения. Например:

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

Я использую "Максимум«здесь, чтобы выбрать произвольную ценность, в мероприятии более одного. Вы можете использовать»мин«Или все, что вы считаете соответствующим в вашем случае.

Возможно, это еще легко понять, чем левое соединение, но (кроме того, от двух не совсем эквивалентных), присоединение будет работать лучше, чем n подсессиуты (намного лучше, n велик).

Во всяком случае, с точки зрения обучения, хорошо понимать оба.

Другие советы

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

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

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'

Попробуй это

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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top