没有内置语法允许您动态引用一组列,即没有明确命名它们.如果需要动态性,则需要查询元数据以获取所需的列名,然后动态构建最终查询.
但在此之前,您仍然需要了解动态查询应该如何完成执行作业本身.因此,您首先需要在有限列集上解决问题.
解决这个问题的方法不止一种. method suggested by @bluefeet可能是更清晰,效率更低的一种.您可以尝试至少两种选择:
>使用条件聚合分别计算每列,并将所有结果合并到一个表达式中:
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技巧在here中解释.)
>使用交叉连接取消数据列到虚拟表,然后将条件应用于不透明的列:
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
;
(在某种程度上,这类似于@ bluefeet的建议,它只是不使用任何UNION.)