Оператор DB2 CASE - PullRequest
       14

Оператор DB2 CASE

5 голосов
/ 22 апреля 2010

Мне нужно как-то использовать синтаксис CASE (который мне не подходит), чтобы влиять на результаты базы данных на основе критериев. У меня есть куча роялти в форме 0. # (роялти) У меня есть ID заголовка # (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 ]

9 голосов
/ 22 апреля 2010

На самом деле, вы не должны использовать оператор 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;
0 голосов
/ 22 апреля 2010

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

РЕДАКТИРОВАТЬ

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

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

...