Ir para conteúdo

POWERED BY:

Arquivado

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

André Severino

[Resolvido] Tem como usar ' IF ' dentro de uma consulta S

Recommended Posts

Boa noite pessoal, ultimamente venho estudando mais as instruções SQL e estou tentando cada vez mais otimizar meus sistemas usando alguns recursos do proprio banco de dados, e venho a todos pedir uma orientação em uma questão que não sei se é possível ou não, abaixo vou ilustrar o meu problema:

 

- Tenho 2 tabelas:

 

usuario

Campos: id_usuario | nome_usuario | senha_usuario

 

usuario_contato

Campos: id_contato | fk_id_usuario | descricao_contato

 

Como podem ver, eu tenho uma chave estrangeira na tabela usuario_contato relacionando com a tabela usuário. Até este ponto sem problema, ok ?

 

O x da questão vem agora, como eu faço para fazer uma consulta buscando agrupando as 2 consultas sabendo que:

- O campo fk_id_usuario não é obrigatório.

 

Teoricamente a forma da consulta seria assim:

 SELECT u.*, c.* FROM usuario AS u
  JOIN usuario_contato AS c
   ON c.fk_id_usuario = u.id_usuario
 WHERE u.id_usuario = 5

 

Mas se o usuário de id 5 não inseriu nenhuma informação de contato a FK da tabela contato estará vazia e com isso a consulta não ira retornar nada certo ?

 

 

Atualmente eu tenho que fazer 3 consultas para resolver isso, primeiro faço uma consulta na tabela de usuario:

SELECT * FROM usuario WHERE id_usuario = 5

 

Depois faço uma verificação na tabela contato_usuario para ver se existe algum registro pertinente ao usuário

qtd = SELECT COUNT(*) FROM usuario_contato WHERE fk_id_usuario = 1
// verifico se existe os dados, então faço uma consulta para armazenar os dados

if ( qtd > 0 ) 
 contato = SELECT * FROM usuario_contato WHERE fk_id_usuario = 1

 

Alguém poderia me ajudar ? O que eu pensei em fazer é algo parecido com isso:

 

SELECT u.*, c.* FROM usuario AS u

  IF c.fk_id_usuario != NULL faca {
     JOIN usuario_contato AS c
      ON c.fk_id_usuario = u.id_usuario
 } 

 WHERE u.id_usuario = 5

 

 

 

Ps.: no contexto do meu projeto, a tabela usuario_contato só vai poder armazenar 1 unico registro, ou seja, eu posso trazer ele junto com join pois vai ter apenas 1 linha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Motta,

 

Obrigado por me ajudar, realmente usando o LEFT deu certo, mas agora fiquei com uma pequena dúvida, o LEFT e o RIGHT fazem o mesmo papel certo?

 

E o INNER JOIN e JOIN, trazem os dados restritamente como pedem a consulta ?

 

 

obrigado e até mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

aparentemente sim.

não é um IF, mas funciona como tal e é mais rapido.

 

lembro que usei muito uma sintaxe similiar em vb6/SQLSERVER, e que também é usada em oracle.

então foi só buscar no google

 

só depende de como você vai usar, pq precisa das constantes para comparar (no exemplo 'one', 'two' e 'more')

 

no link abaixo tbm mostra uso de if, mas "case when" é muito mais rapido.

 

http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

 

 

mysql> SELECT CASE 1 WHEN 1 THEN 'one'

-> WHEN 2 THEN 'two' ELSE 'more' END;

-> 'one'

mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;

-> 'true'

mysql> SELECT CASE BINARY 'B'

-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;

-> NULL

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro que tem como fazer IF, não só IF, como toda estrutura if / elseif / else ..

mysql> select if( 'a' = 'a', 'a é igual', 'Não é igual' );
+---------------------------------------------+
| if( 'a' = 'a', 'a é igual', 'Não é igual' ) |
+---------------------------------------------+
| a é igual                                   |
+---------------------------------------------+
1 row in set (0.00 sec)

 

Já o else/elseif só em procedure.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, entendi, obrigado Andrey, Motta e barogana.

 

Eu resolvi usando o LEFT JOIN mesmo, porque precisava juntar uma tabela, eu achei que os if() poderia inserir dps do from, mas é so nos campos :P

 

obrigado e até mais :thumbsup:

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.