2010-04-22 13 views
6

Ho bisogno di usare in qualche modo la sintassi CASE (che è oltre me) per influenzare i risultati del database in base a criteri. Ho un mucchio di royalties in 0. # modulo (royalty) Ho un ID titolo # (title_id) e ho bisogno di mostrare il nuovo aumento dei diritti d'autore in modo che io possa utilizzare i dati.DB2 CASE Statement

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 

Qualsiasi aiuto sarebbe molto apprezzato.

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

Gli ultimi due "IF:" s possono essere compressi in una singola condizione poiché sono adiacenti ... solo una nota – AtliB

risposta

9

In realtà, non si necessità di utilizzare il case dichiarazione:

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; 

(sotto controllo transazionale se avete bisogno di atomicità). Potresti combinare i primi due se hanno lo stesso moltiplicatore dei tuoi stati di domanda.

Funziona assicurandosi di eseguire prima i valori più alti e limitare le righe interessate nella clausola where.

se senti di necessario utilizzare uncase dichiarazione:

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; 

Per cambiare solo quello che stai tirando fuori dal tavolo (piuttosto che modificare la tabella stessa) e confrontarla con la corrente:

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

Sì, ma voglio mostrare questo senza alterare i dati, così posso mostrare un confronto del due numeri. –

+0

Mi scuso, @gamerzfuse, ho pensato che volessi modificare la tabella attuale. Guarda il mio aggiornamento su come modificare semplicemente i dati che escono dal tavolo. – paxdiablo

+0

Grazie, la seconda parte ha funzionato! –

0

non conosco la sintassi esatta DB2, né se è diverso da Oracle o SQL Server, ma direi qualcosa come il seguente:

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 
) 

Qualcosa attorno a questo codice potrebbe fare il lavoro, se ho capito bene la domanda. Ciò applicherebbe il rilancio per ogni riga ogni volta che viene avviato l'aggiornamento. È possibile aggiungere una clausola where se si desidera eseguire un aggiornamento condizionale per ogni riga.

EDIT

Sì, ma io voglio mostrare questo senza alterare i dati, in modo da poter mostrare un confronto tra i due numeri

vuoi dire desideri solo eseguire un'istruzione select con il valore iniziale in una colonna e il valore generato in un'altra?