Инструкция DB2 CASE

мне нужно как-то использовать синтаксис CASE (который вне меня), чтобы повлиять на результаты базы данных на основе критериев. У меня куча гонораров в 0.# форма (роялти) У меня есть идентификатор заголовка # (title_id), и мне нужно показать новое увеличение роялти, чтобы я мог использовать данные.

IF: they have a current royalty of 0.0 - 0.1 = 10% raise
IF: they have 0.11 - 0.15 = 20% raise
IF: royalty >= 0.16 =  20% raise

любая помощь была бы очень признательна.

    create table royalites (
title_id    char(6),
lorange     integer,
hirange     integer,
royalty     decimal(5,2));

2 ответов


вообще-то, ты не нужно использовать case о себе:

update royalties set royalty = royalty * 1.2
    where royalty >= 0.16;
update royalties set royalty = royalty * 1.2
    where royalty >= 0.11 and royalty < 0.16;
update royalties set royalty = royalty * 1.1
    where royalty < 0.11;

(под транзакционным контролем, если вам нужна атомарность). Вы можете объединить первые два, если они имеют тот же множитель, что и ваши состояния вопроса.

он работает, гарантируя, что вы сначала делаете более высокие значения и ограничиваете, какие строки затрагиваются в where предложения.

если вы чувствуете, что вы должны использовать case о себе:

update royalties set royalty =
    case when royalty >= 0.16 then royalty * 1.2
    case when royalty >= 0.11 and royalty < 0.16 then royalty * 1.2
    case when royalty <  0.11 then royalty * 1.1
    end;

в просто измените то, что вы вытаскиваете из таблицы (а не меняете саму таблицу), и сравните ее с текущей:

select title_id, lorange, hirange, royalty,
    case when royalty >= 0.16 then royalty * 1.2
    case when royalty >= 0.11 and royalty < 0.16 then royalty * 1.2
    case when royalty <  0.11 then royalty * 1.1
    end as new_royalty
    from royalties;

Я не знаю точного синтаксиса DB2, ни отличается ли он от Oracle или SQL Server, но я бы предположил что-то вроде следующего:

update royalties as r
set r.royalty = r.royalty * (
    select case 
                when r.royalty between 0.0 and 0.1 then 1.1
                when r.royalty > 0.11 then 1.2
            and
        from royalties
)

что-то вокруг этого кода может выполнить эту работу, если я правильно понимаю вопрос. Это применит повышение для каждой строки при запуске обновления. Вы можете добавить предложение where, если хотите выполнить условное обновление для каждой строки.

редактировать

да, Но я хочу показать это без изменения данных, поэтому я могу показать сравнение двух чисел

вы имеете в виду, что хотите выполнить оператор select только с начальным значением в одном столбце и повышенным значением в другом?