Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Emerson Luiz

CASE Mysql

Recommended Posts

Amigos,

 

Eu tenho uma query que recebe variáveis, até ai OK....

 

Minha query as vezes vem assim:

 

SELECT Count(disposition) FROM vw_cdr WHERE disposition = 'NO ANSWER' AND src=98339 OR cidade ='' AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')

 

ou assim:

SELECT Count(disposition) FROM vw_cdr WHERE disposition = 'ANSWERED' AND src=98339 AND cidade ='Belo Horizonte' AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')

 

Pode ser que venha com cidade, estado ou outras informações...

 

O que preciso é fazer uma CASE que trate isso, ou seja se a variável vem

 

Tipo assim:

 

SELECT Count(disposition)
FROM vw_cdr
WHERE disposition = 'NO ANSWER'
AND src=98339
CASE
WHEN cidade = ''
THEN NAO FAZ NADA
WHEN cidade = 'cidade'
THEN AND cidade = 'Belo Horizonte'
Alguém pode me dar um help ?
END;

 

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi exatamente.

SELECT
  Count(disposition),
  CASE cidade
    WHEN '' THEN 'nao faz nada'
    ELSE cidade
  END cidade
FROM vw_cdr
WHERE disposition = 'ANSWERED'
  AND src=98339
  AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')

Poderia dar mais exemplos? ( CASE MySQL, no google )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lokaodomau,

 

Obrigado pelo retorno...

 

O que eu preciso é verificar se uma variável foi ou não passada. Se foi passada, ele complementa com o AND vairavel = 'variavel', caso contrario ele não passa nada.

 

Seria algo assim tambem:

 

if variavel = ''

elif variavel = 'variavel'

else

 

 

Ficou mai claro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim

 

 

 

Where cidade = coalece(trim(:var_cidade),cidade)

 

 

 

 

Se a variável cidade for nula ou em branco retorna todas as cidades , se foi infornada busca este conteúdo no campo cidade e retorna se encontrar.

É isto ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

obrigado pela ajuda mais uma vez....

 

acho que seria isso sim... como ficaria nessa query:

 

SELECT Count(disposition) FROM vw_cdr WHERE disposition = 'NO ANSWER' AND src=99922 OR cidade ='' AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')

 

Obrigado


Motta,

 

obrigado pela ajuda mais uma vez....

 

 

Motta,

 

obrigado pela ajuda mais uma vez....

 

acho que seria isso sim... como ficaria nessa query:

 

SELECT Count(disposition) FROM vw_cdr WHERE disposition = 'NO ANSWER' AND src=99922 OR cidade ='' AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')

 

Obrigad

Tentei assim e não deu certo:

 

SELECT Count(disposition)
FROM vw_cdr
WHERE disposition = 'ANSWERED' AND src = coalece(trim(:src),99922)

 

ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':src),99922)' at line 3

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Achie o erro na seu codigo. Basta tirar o ":"... Porem, esta passando mas a CIDADE esta sendo ignorada:

 

SELECT Count(disposition) 
FROM vw_cdr 
WHERE disposition = 'ANSWERED' 
AND src= 99922 
AND cidade = COALESCE(trim(cidade),'Sao Paulo') 
AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')


+--------------------+
| Count(disposition) |
+--------------------+
|                  4 |
+--------------------+
1 row in set (0,01 sec)

No exemplo acima ele ignora completamente a variável cidade... ele faz o mesmo que:

 

SELECT Count(disposition) 
FROM vw_cdr 
WHERE disposition = 'ANSWERED' 
AND src=99922  
AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59');


+--------------------+
| Count(disposition) |
+--------------------+
|                  4 |
+--------------------+
1 row in set (0,01 sec)
O CORRETO SERIA:
SELECT Count(disposition) 
FROM vw_cdr 
WHERE disposition = 'ANSWERED' 
AND src=99922 
AND cidade ='Sao Paulo' 
AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59');


+--------------------+
| Count(disposition) |
+--------------------+
|                  2 |
+--------------------+
1 row in set (0,00 sec)

Obrigado


Motta,

 

Invertir a variavel....

 

agora esta correto...

 

SELECT Count(disposition) 
FROM vw_cdr 
WHERE disposition = 'ANSWERED' 
AND src= 99922 
AND cidade = COALESCE(trim('Sao Paulo'),cidade) 
AND calldate BETWEEN ('2015-04-18T00:00:00') AND ('2015-04-23T23:59:59')

Obrigado pela ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

No primeiro parametro do COALESCE vai a variável ou paramêtro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Agora o erro é outro, Se nao escolher a cidade, e retorna como ZERO, mas tem dados la....

 

SELECT Count(disposition) 
FROM vw_cdr 
WHERE disposition = 'ANSWERED' 
AND src= 99922 
AND cidade = COALESCE(trim(''),cidade) 
AND calldate BETWEEN ('2015-04-09T00:00:00') AND ('2015-04-23T23:59:59')


+--------------------+
| Count(disposition) |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0,01 sec)

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT Count(disposition)

FROM vw_cdr

WHERE disposition = 'ANSWERED'

AND src= 99922

--AND cidade = COALESCE(trim(''),cidade)

AND calldate BETWEEN ('2015-04-09T00:00:00') AND ('2015-04-23T23:59:59')

 

Com a linha comentada o que retorna ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Retorna

+--------------------+
| Count(disposition) |
+--------------------+
|                  4 |
+--------------------+
1 row in set (0,01 sec)

Que é o correto....


Motta,

 

 

com um simples AND NOT resolveu...

 

AND NOT cidade = COALESCE(TRIM(''),cidade)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.