Проверьте, существует ли внутри оператора SQL CASE - PullRequest
2 голосов
/ 19 февраля 2009

Я пытаюсь обновить столбец в таблице a в зависимости от того, находится ли другой столбец в таблице в наборе результатов из таблицы b. В настоящее время варианты на:

update a
set a.field1 =
 case
 when exists (
   select b.field2
   from b
   where b.field2 = a.field2
 )
 then 'FOO'
 else 'BAR'
 end

не работает. Есть идеи, как это сделать для базы данных DB2?

Редактировать : Спасибо за ваши ответы, лучшее, что я могу сделать, это

update a set field1 = 'FOO' where field2 in (select field2 from b);

update a set field1 = 'BAR' where field2 not in (select field2 from b);

Но я оставлю это открытым, если кто-то сможет найти версию кода вверху, которая работает.

Ответы [ 4 ]

6 голосов
/ 25 февраля 2009

Я работаю над коробкой DB2 for iSeries. Попробуйте это:

update a
set a.field1 =
 Coalesce( ( select 'FOO'
             from b
             where b.field2 = a.field2 ),
                      'BAR' )

Coalesce() - это функция, которая возвращает первый ненулевой элемент в списке.

3 голосов
/ 19 февраля 2009

Это работает в SQLServer. Возможно, у DB2 аналогичная конструкция.

update a SET field1 = 'BAR'
from a
     left outer join b on b.field1 = a.field1
where b.field1 is null;
update a SET field1 = 'FOO'
from a
     inner join b on b.field1 = a.field1

С уважением,
Ливны

0 голосов
/ 19 февраля 2009

Я не эксперт по SQL или DB2, но, возможно, вы можете объединить две таблицы и проверить, является ли b.field1 нулевым?

update a
set a.field1 = case when b.field1 is not null then 'FOO' else 'BAR' end
from a full outer join b on a.field1 = b.field1
0 голосов
/ 19 февраля 2009

Первое вхождение a.field1 должно быть a.field2.

Вы сказали, "есть ли другой набор в таблице в наборе ..."

Ваш код изменяет тот же столбец, а не другой столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...