Không có cú pháp tích hợp nào cho phép bạn tham chiếu động đến một tập hợp các cột, tức là mà không đặt tên chúng một cách rõ ràng. Nếu bạn muốn tính năng động, bạn sẽ cần truy vấn siêu dữ liệu để lấy tên cột được yêu cầu, sau đó tạo truy vấn cuối cùng một cách động.
Nhưng trước đó, bạn vẫn cần phải có ý tưởng về cách chính xác truy vấn động sẽ thực hiện công việc như thế nào. Vì vậy, trước tiên bạn sẽ cần giải quyết vấn đề trên một hữu hạn tập hợp cột.
Có nhiều cách để giải quyết vấn đề này. phương pháp do @bluefeet đề xuất có lẽ là một trong những cách rõ ràng hơn cũng như kém hiệu quả hơn. Bạn có thể thử ít nhất hai lựa chọn thay thế:
-
Đếm từng cột riêng biệt bằng cách sử dụng tổng hợp có điều kiện và cộng tất cả các kết quả trong một biểu thức:
SELECT COUNT(DATA1 > 0 OR NULL) + COUNT(DATA2 > 0 OR NULL) + COUNT(DATA3 > 0 OR NULL) + COUNT(DATA4 > 0 OR NULL) + COUNT(DATA5 > 0 OR NULL) + COUNT(DATA6 > 0 OR NULL) + COUNT(DATA7 > 0 OR NULL) AS TOTAL FROM yourtable ;
(
OR NULL
thủ thuật được giải thích tại đây .) -
Giải nén
DATA
các cột bằng cách sử dụng liên kết chéo vào một bảng ảo, sau đó áp dụng điều kiện cho cột không được phân chia:SELECT COUNT(*) AS TOTAL FROM ( SELECT CASE s.col WHEN 'DATA1' THEN DATA1 WHEN 'DATA2' THEN DATA2 WHEN 'DATA3' THEN DATA3 WHEN 'DATA4' THEN DATA4 WHEN 'DATA5' THEN DATA5 WHEN 'DATA6' THEN DATA6 WHEN 'DATA7' THEN DATA7 END AS DATA FROM yourtable CROSS JOIN ( SELECT 'DATA1' AS col UNION ALL SELECT 'DATA2' UNION ALL SELECT 'DATA3' UNION ALL SELECT 'DATA4' UNION ALL SELECT 'DATA5' UNION ALL SELECT 'DATA6' UNION ALL SELECT 'DATA7' ) s ) s WHERE DATA > 0 ;
(Theo một cách nào đó, điều này tương tự như đề xuất của @ bluefeet, nó chỉ không sử dụng bất kỳ UNION nào.)