выберите строку из таблицы и замените поле одним из другого столбца, если он существует - PullRequest
5 голосов
/ 09 июня 2010

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

Проблема: Есть две таблицы: A и B. Я хотел бы выбрать все столбцы из таблицы A (имеющие столбцы: id, name, description) и заменить столбец «A.name» значением столбца «B.title». из таблицы 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 ]

3 голосов
/ 09 июня 2010
Бьюсь об заклад,

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 велико).

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

2 голосов
/ 09 июня 2010
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
1 голос
/ 09 июня 2010

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

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'
0 голосов
/ 09 июня 2010

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

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'
...