2011-10-31 35 views
11

Tôi có một cơ sở dữ liệu sản phẩm có nhiều bảng để lưu trữ giá (vì giá mặc định và giá ghi đè tùy chọn cho mỗi màu sản phẩm) và tôi có các câu lệnh CASE trong truy vấn của mình để nhận được * Giá gốc của sản phẩm * Giá bán của sản phẩm, nếu sản phẩm đang được bánTuyên bố CASres Postgresql - tôi có thể sử dụng giá trị trả về của CASE trong SELECT của tôi không?

Tôi cũng cần tính toán GIẢM GIÁ của sản phẩm nếu sản phẩm đang được bán. Trước khi tôi thử điều này, xin vui lòng xem các phân tích của SQL hiện tại của tôi mà hoạt động.

SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price 

FROM product p, ... etc. 

Đoạn mã trên làm việc (tôi đã đơn giản hóa nó), và về cơ bản, giá gốc của sản phẩm được lưu trữ trong các bí danh cột "final_original_price", và giá bán (có thể NULL) được trả về như "final_sale_price".

Bây giờ tôi muốn thêm một dòng bổ sung vào lệnh SELECT để được giảm giá. Tôi không thể sử dụng các trường hiện có trong bảng thực tế vì tôi muốn các giá trị trả về đó là "final_original_price" và "final_sale_price" để thực hiện các phép tính.

ví dụ:

SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price, 

((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage 

FROM product p, ... etc. 

ở trên không hoạt động, như PostgreSQL trả về "ERROR: Cột 'final_original_price' không tồn tại ở nhân vật ....."

Vì vậy, rõ ràng tôi không thể sử dụng giá trị trả về trường hợp. Câu hỏi của tôi về giải pháp sử dụng:

1) Tôi thực sự có thể sử dụng giá trị trả lại của trường hợp như tôi muốn ở trên không? HOẶC 2) Tôi có cần phải cắm lại tuyên bố trường hợp vào tính toán của mình không? Điều đó có nghĩa là tôi cần phải lặp lại mã CASE và truy vấn sẽ trông khá dài. Nếu tôi phải làm thế, tôi sẽ làm điều này, nhưng tôi chỉ tự hỏi liệu có cách nào tốt hơn không. HOẶC 3) Tôi cũng có thể lưu trữ một trường bổ sung trong cơ sở dữ liệu để lưu trữ giảm giá. Dữ liệu này sẽ không cần thiết vì CMS của tôi sẽ cần đảm bảo rằng trường được cập nhật bất cứ khi nào giá được cập nhật. Tuy nhiên nó sẽ tiết kiệm được những tính toán nặng nề (nếu ở trên được coi là nặng) trên giao diện người dùng chạy thường xuyên hơn nhiều so với CMS phụ trợ.

Các giải pháp trên có lẽ là dễ nhất, nhưng tôi cũng tự hỏi, nếu tôi có thời gian để làm điều này, có giải pháp nào khác ở đây đáng xem xét không? Ví dụ, đây có phải là một tình huống tốt để viết "chế độ xem" không? Cá nhân tôi chưa bao giờ thiết lập chế độ xem và theo như tôi hiểu, công việc chọn cơ sở dữ liệu vẫn đang diễn ra ở chế độ nền, nhưng nếu được thiết lập, sẽ làm cho truy vấn cuối dễ hiểu hơn từ quan điểm của nhà phát triển.

Rất cám ơn!

+3

Xin lưu ý rằng vấn đề của bạn không liên quan gì đến 'CASE'. Đây là một vấn đề chung của SQL như bạn có thể thấy trong ví dụ tối thiểu này: 'SELECT 42 AS x, 12 AS y, x * y AS z'. Điều này tạo ra cùng một lỗi. –

Trả lời

14

sử dụng

SELECT 
productid, 
stylename, 
final_original_price, 
final_sale_price, 
((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage 
FROM 
(
SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price 
FROM product p, ... etc. 
) 

Trên đây thực hiện chính xác những gì bạn yêu cầu ... nếu vì một lý do nào bạn không muốn sử dụng sau đó nó cắm các CASE báo cáo vào tính toán (phương án 2 từ câu hỏi của bạn) .

+0

Rực rỡ! Cảm ơn bạn!! Tôi sẽ sử dụng truy vấn con SELECT bây giờ. – rishijd

+0

bạn được chào đón :-) xin đừng quên upvote/mark như chấp nhận bất kỳ câu trả lời đó là giúp đỡ! – Yahia

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