2010-10-07 27 views
6

Nếu không sử dụng các chức năng tùy chỉnh, có thể trong SQLite để làm như sau. Tôi có hai bảng, được liên kết thông qua các số id phổ biến. Trong bảng thứ hai, có hai biến. Những gì tôi muốn làm là có thể trả về một danh sách các kết quả, bao gồm: id hàng và NULL nếu tất cả các trường hợp của hai biến đó (và có thể có nhiều hơn hai) là NULL, 1 nếu chúng là 0 và 2 nếu một hoặc nhiều là 1."nếu, sau đó, khác" trong SQLite

những gì tôi có ngay bây giờ là như sau:


SELECT 
    a.aid, 
    (SELECT count(*) from W3S19 b WHERE a.aid=b.aid) as num, 
    (SELECT count(*) FROM W3S19 c WHERE a.aid=c.aid AND H110 IS NULL AND H112 IS NULL) as num_null, 
    (SELECT count(*) FROM W3S19 d WHERE a.aid=d.aid AND (H110=1 or H112=1)) AS num_yes 
FROM W3 a 

vì vậy, điều này đòi hỏi phải có được để bước qua mỗi kết quả như sau (thô Python giả):


if row['num_yes'] > 0: 
    out[aid] = 2 
elif row['num_null'] == row['num']: 
    out[aid] = 'NULL' 
else: 
    out[aid] = 1 

Có cách nào dễ dàng hơn không? Cảm ơn!

Trả lời

23

Sử dụng CASE...WHEN, ví dụ:

CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END 

Đọc thêm từ SQLite syntax manual (chuyển đến phần "Biểu thức CASE").

+0

Tuyệt vời, cảm ơn của tôi về điều này! –

1

Có một cách khác, cho các giá trị số, có thể dễ dàng hơn đối với một số trường hợp cụ thể. Nó dựa trên thực tế là các giá trị boolean là 1 hoặc 0, "nếu tình trạng" đưa ra một kết quả boolean:

(điều này sẽ chỉ làm việc cho "hoặc" điều kiện, phụ thuộc vào cách sử dụng)

SELECT (w1=TRUE)*r1 + (w2=TRUE)*r2 + ... 

tất nhiên câu trả lời của @ evan là mục đích chung, câu trả lời đúng

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