Ошибка в условном UNION - PullRequest
0 голосов
/ 17 мая 2018

У меня есть этот 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'

Я пытался, но всегда получал синтаксическую ошибку.

Возможно ли это сделать?

1 Ответ

0 голосов
/ 17 мая 2018

Переместите ваши условия в условие WHERE внутри каждого UNION SELECT (вы не можете поместить ничего, кроме SELECT между UNION).

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...)
...