首页 > 解决方案 > 条件 UNION 中的错误

问题描述

我有这个 SQL:

SELECT        MONTH(data) AS MES, cor, CASE month(data) 
                          WHEN 1 THEN 'Janeiro' WHEN 2 THEN 'Fevereiro' WHEN 3 THEN 'Março' WHEN 4 THEN 'Abril' WHEN 5 THEN 'Maio' WHEN 6 THEN 'Junho' WHEN 7 THEN 'Julho' WHEN
                          8 THEN 'Agosto' WHEN 9 THEN 'Setembro' WHEN 10 THEN 'Outubro' WHEN 11 THEN 'Novembro' WHEN 12 THEN 'Dezembro' END AS MESCOR, COUNT(*) 
                          AS Expr1, CASE cor WHEN 'AM' THEN '2' WHEN 'VD' THEN '1' WHEN 'VM' THEN '3' END AS Expr2 

FROM            TBINICIATIVAS_PREVISTAS
WHERE        (login ='xxxxxxx')
GROUP BY MONTH(data), cor

UNION 
SELECT '1', 'VD', 'Janeiro',0,'1' 

UNION
SELECT '1', 'AM', 'Janeiro',0,'2' 

UNION
SELECT '1', 'VM', 'Janeiro',0,'3'


ORDER BY expr2, mes

但我需要UNION有条件。就像是:

if (select count(*) .... where cond1...) = 0
UNION 
SELECT '1', 'VD', 'Janeiro',0,'1' 

if (select  count(*) ....where cond2...) = 0
UNION
SELECT '1', 'AM', 'Janeiro',0,'2'

if (select  count(*) ....where cond3...) = 0
UNION
SELECT '1', 'VM', 'Janeiro',0,'3'

我试过了,但我总是遇到语法错误。

有可能这样做吗?

标签: sqlsql-serverif-statementconditionalunion

解决方案


将您的条件移动到each 中的一个WHERE子句(您不能放置除between之外的任何内容)。UNIONSELECTSELECTUNION

SELECT '1', 'VD', 'Janeiro',0,'0'

UNION 

SELECT '1', 'VD', 'Janeiro',0,'1' 
WHERE (select  count(*) ....where cond1...) = 0

UNION

SELECT '1', 'AM', 'Janeiro',0,'2'
WHERE (select  count(*) ....where cond2...) = 0

UNION

SELECT '1', 'VM', 'Janeiro',0,'3'
WHERE (select  count(*) ....where cond3...) = 0

另外,我从您的条件中注意到,您正在检查该行是否存在,方法是执行count = 0. 用实际值替换它NOT EXISTS会更快,因为 SQL 引擎不必实际计算所有行来与 0 进行比较,它会在找到行时立即返回。

SELECT '1', 'VD', 'Janeiro',0,'0'

UNION 

SELECT '1', 'VD', 'Janeiro',0,'1' 
WHERE NOT EXISTS (select  1 ....where cond1...)

UNION

SELECT '1', 'AM', 'Janeiro',0,'2'
WHERE NOT EXISTS (select  1 ....where cond2...)

UNION

SELECT '1', 'VM', 'Janeiro',0,'3'
WHERE NOT EXISTS (select  1 ....where cond3...)

推荐阅读