Neexistuje žádná vestavěná syntaxe, která by vám umožnila odkazovat na sadu sloupců dynamicky, tj. bez jejich explicitního pojmenování. Pokud chcete dynamiku, budete muset zadat metadata, abyste získali požadované názvy sloupců, a poté dynamicky sestavit konečný dotaz.
Předtím však musíte mít představu, jak přesně by měl dynamický dotaz probíhat při provádění samotné úlohy. Nejprve tedy budete muset problém vyřešit na konečném sada sloupců.
Existuje více než jeden způsob, jak tento problém vyřešit. metoda navržená @bluefeet je pravděpodobně jedním z přehlednějších i méně účinných. Můžete zkusit alespoň dvě alternativy:
-
Počítejte každý sloupec samostatně pomocí podmíněné agregace a sečtěte všechny výsledky do jednoho výrazu:
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
trik je vysvětlen zde .) -
Odklopte
DATA
sloupce pomocí křížového spojení s virtuální tabulkou a poté aplikujte podmínku na neotočný sloupec: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 ;
(Svým způsobem je to podobné návrhu @bluefeet, jen to nezaměstnává žádné UNIONy.)