2010-11-14 44 views
7

Không chắc chắn về cách truy vấn sql có thể đi với câu lệnh if/else.mysql IF Tuyên bố khác

Tôi có một câu lệnh SELECT đơn giản:

CHỌN amount, transtype TỪ transactions

Cột transtype sẽ là một số.

Ví dụ: 1 = bán, 2 = hoàn lại tiền, 3 = lỗi, 4 = bị hủy, 5 = cái gì khác .... v.v.

Vì vậy, không có gì phức tạp. Nhưng danh sách có xu hướng phát triển vì lý do báo cáo. Mà là tốt.

Đối với một truy vấn cụ thể mà tôi đang làm việc, có cách nào trích xuất cột đó làm một trong hai hoặc ba số hoặc văn bản được chỉ định không?

Ví dụ: một số số transtype là 'mất', trong khi một số khác là 'tăng' và có thể số khác là 'trung lập'.

Tôi muốn trích xuất cột đó chỉ với 3 cột, mà không cần sử dụng php bên trong bảng html tôi đang ném các hàng vào.

Nếu giải thích của tôi không rõ ràng, xin lỗi tôi. Thật khó để nhổ ra.

+0

Bạn muốn phân loại các giá trị transtype của bạn là bị mất, tăng hoặc trung tính? –

Trả lời

3

Sử dụng MySQL CASE() chức năng đối với một số cố định của các đối số. Nếu danh sách đang trở nên lớn, bạn nên sử dụng một bảng thứ hai và tham gia chúng.

Ví dụ:

SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; 
2

Hãy thử tham gia với một bảng khác có chứa các loại giao dịch. Một cái gì đó như:

TRANSACTION_TYPES 
transtype | number 
label  | varchar(32) 

Sau đó sửa đổi truy vấn của bạn để bao gồm các tham gia:

select t.amount, t.transtype, l.label 
    from transactions.t 
    join transaction_types l on t.transtype = l.transtype; 
+0

Tôi đang cố gắng tránh xa cái bàn phụ. Tôi không lường trước được loại hình transtype đang phát triển hơn 10 con số. Nhưng bạn nói đúng, đó là một giải pháp nhanh chóng. – coffeemonitor

+0

Nó cũng sẽ duy trì tính toàn vẹn quan hệ của cơ sở dữ liệu, để bạn có thể hiểu được nó mà không có truy vấn cụ thể để "giải thích" số ma thuật của bạn cho bạn. –

0

Chức năng ELT nên làm các trick:

SELECT ELT(`transtype`, 'loss', 'loss', 'gain', 'neutral', …) FROM … 

Không rất thanh lịch mặc dù, và hợp lý tôi sẽ làm điều này trong logic xem, không logic cơ sở dữ liệu.

0

Có thể bạn nên sử dụng ENUM type cho cột đó. Nó được giới hạn ở 64 giá trị, tuy nhiên nếu bạn cần nhiều hơn thì bạn nên tạo một bảng mới và JOIN nó trong truy vấn.

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