Оператор выбора DB2

Я должен так или иначе использовать синтаксис СЛУЧАЯ (который является вне меня) влиять на результаты базы данных на основе критериев. У меня есть набор роялти в 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));
5
задан Craig Hooghiem 22 April 2010 в 13:14
поделиться

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;
9
ответ дан 14 December 2019 в 01:04
поделиться

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

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

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

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

0
ответ дан 14 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: