2010-04-22 46 views
6

Tôi cần bằng cách nào đó sử dụng cú pháp CASE (nằm ngoài tôi) để ảnh hưởng đến kết quả cơ sở dữ liệu dựa trên các tiêu chí. Tôi có một số tiền bản quyền bằng 0. # mẫu (tiền bản quyền) Tôi có ID tiêu đề # (title_id) và tôi cần hiển thị mức tăng mới về tiền bản quyền để tôi có thể sử dụng dữ liệu.Tuyên bố CASE của DB2

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 

Mọi trợ giúp sẽ được đánh giá cao.

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

Hai "IF:" cuối cùng có thể bị thu gọn thành một điều kiện duy nhất vì chúng là phụ lục ... chỉ cần ghi chú – AtliB

Trả lời

9

Trên thực tế, bạn không cần phải sử dụng case tuyên bố:

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; 

(dưới sự kiểm soát giao dịch nếu bạn cần số nguyên tử). Bạn có thể kết hợp hai cái đầu tiên nếu chúng có cùng hệ số với trạng thái câu hỏi của bạn.

Tính năng này hoạt động bằng cách đảm bảo bạn thực hiện các giá trị cao hơn trước và giới hạn những hàng nào bị ảnh hưởng trong mệnh đề where.

Nếu bạn cảm thấy bạn phải sử dụng một tuyên bố 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; 

Để chỉ cần thay đổi những gì bạn đang kéo ra khỏi bảng (chứ không phải là thay đổi bảng chính nó) và so sánh nó với hiện tại:

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

Có, Nhưng tôi muốn hiển thị điều này mà không thay đổi dữ liệu, vì vậy tôi có thể so sánh hai số. –

+0

Xin lỗi, @gamerzfuse, tôi nghĩ bạn muốn sửa đổi bảng thực tế. Xem cập nhật của tôi về cách chỉ thay đổi dữ liệu sắp ra khỏi bảng. – paxdiablo

+0

Cảm ơn, phần thứ hai đã làm việc quyến rũ! –

0

tôi không biết cú pháp DB2 chính xác, không cho dù đó là khác nhau từ Oracle hoặc SQL server, nhưng tôi sẽ đoán giống như sau:

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 
) 

Nội dung nào đó xung quanh mã này có thể thực hiện công việc, nếu tôi hiểu đúng câu hỏi. Điều này sẽ áp dụng mức tăng cho mỗi hàng bất cứ khi nào bản cập nhật được khởi chạy. Bạn có thể thêm mệnh đề where nếu bạn muốn thực hiện cập nhật có điều kiện cho mỗi hàng.

EDIT

Vâng, Nhưng tôi muốn thể hiện điều này mà không làm thay đổi dữ liệu, vì vậy tôi có thể hiển thị một so sánh của hai số

Bạn có nghĩa là bạn chỉ muốn thực hiện câu lệnh chọn có giá trị ban đầu trong một cột và giá trị được tăng lên trong một cột khác?

Các vấn đề liên quan