Jump to content
Leudassdf

[Resolvido] IF num select

Recommended Posts

Leudassdf

Boas pessoal,

eu tenho a seguinte instrução:

SELECT produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico,

produto.Quantidade_minima_venda, produto.cod_categoria, Favoritos.gosta_s_n AS favorito

FROM produto INNER JOIN

Favoritos ON produto.cod_produto = Favoritos.cod_produto AND Favoritos.username = 'test'

O que eu desejo fazer é transformar o valor que me é devolvido pelo favoritos.gosta_s_n.Este campo só devolve 0 ou 1. Se ele devolver 0 quero transformar para 1 se devolver 1 quero transformar para 0.

Alguém sabe como posso fazer esta transformação através desta instrução?

Cumprimentos

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Com SQL Server 2012 podes usar a função IIF.

Com versões anteriores podes usar CASE, assim:

SELECT		produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico,
					 produto.Quantidade_minima_venda, produto.cod_categoria, CASE Favoritos.gosta_s_n WHEN 1 THEN 0 ELSE 1 END AS favorito
FROM			produto INNER JOIN
					 Favoritos ON produto.cod_produto = Favoritos.cod_produto AND Favoritos.username = 'test'

Espero ter ajudado,

Edited by Rechousa

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Leudassdf

Olá,

Com SQL Server 2012 podes usar a função IIF.

Com versões anteriores podes usar CASE, assim:

SELECT		produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico,
					 produto.Quantidade_minima_venda, produto.cod_categoria, CASE Favoritos.gosta_s_n WHEN 1 THEN 0 ELSE 1 END AS favorito
FROM			produto INNER JOIN
					 Favoritos ON produto.cod_produto = Favoritos.cod_produto AND Favoritos.username = 'test'

Espero ter ajudado,

Perfeito.

Muito obrigado.

Cumprimentos

Share this post


Link to post
Share on other sites
Leudassdf

Olá,

Com SQL Server 2012 podes usar a função IIF.

Com versões anteriores podes usar CASE, assim:

SELECT		produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico,
					 produto.Quantidade_minima_venda, produto.cod_categoria, CASE Favoritos.gosta_s_n WHEN 1 THEN 0 ELSE 1 END AS favorito
FROM			produto INNER JOIN
					 Favoritos ON produto.cod_produto = Favoritos.cod_produto AND Favoritos.username = 'test'

Espero ter ajudado,

Só mais uma pergunta,

a instrução acima funciona na perfeiçao quando na tabela favoritos existe lá um valor correspondente ao username. Mas quando eu nao tenho nenhum registo nessa tabela a instrução nao devolve nada.

No entanto o que eu queria fazer era que quando não houve-se nada nessa tabela para x utilizador a instruçao devolve-se na mesma o produto e a "variavel" favorito devolve-se 0.

Isto é possivel?

O objectivo é devolver sempre todos os produtos que estao na tabela produto. No entanto tambem deve devolver na "variavel" favorito o valor 0 caso na tabela favoritos nao haja registo de informação para esse produto e para x utilizador.

Cumprimentos

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Pelo que percebi, tens de trocar o INNER JOIN pelo LEFT JOIN e terás de testar se o valor do campo gost_s_n é nulo ou não, é isso?

Assim:

SELECT produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico, produto.Quantidade_minima_venda, produto.cod_categoria, CASE COALESCE(Favoritos.gosta_s_n, 1) WHEN 1 THEN 0 ELSE 1 END AS favorito
FROM produto
   LEFT JOIN Favoritos ON produto.cod_produto = Favoritos.cod_produto AND Favoritos.username = 'test'

É isto?


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Leudassdf

Olá,

Pelo que percebi, tens de trocar o INNER JOIN pelo LEFT JOIN e terás de testar se o valor do campo gost_s_n é nulo ou não, é isso?

Assim:

SELECT produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico, produto.Quantidade_minima_venda, produto.cod_categoria, CASE COALESCE(Favoritos.gosta_s_n, 1) WHEN 1 THEN 0 ELSE 1 END AS favorito
FROM produto
LEFT JOIN Favoritos ON produto.cod_produto = Favoritos.cod_produto AND Favoritos.username = 'test'

É isto?

Infelizmente não percebo muito dos left e dos right joins. No entanto o objectivo era devolver sempre um valor para a variável favoritos mesmo que na tabela favoritos.username nao se encontrassem valores para aquele cod_produto ou utilizador.

No entanto esta instrução permitiu-me chegar a solução.

Ficou assim:

SELECT produto.cod_produto, produto.Titulo, produto.Descricao, produto.preco, produto.Quantidade, produto.Unidade_Venda, produto.Biologico,

produto.Quantidade_minima_venda, produto.cod_categoria, CASE (favoritos.gosta_s_n) WHEN 1 THEN 0 ELSE 1 END AS favorito

FROM produto LEFT OUTER JOIN

favoritos ON produto.cod_produto = favoritos.cod_produto AND favoritos.username = 'teste'

Seria possível explicar-me o que faz o left join e o right join? Já estive a ver em alguns sites mas infelizmente nao consigo perceber o que fazem.

Cumprimentos

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Claro que sim!

Em primeiro lugar, antes de "falarmos" sobre LEFT ou RIGHT join, vamos "falar" de INNER JOIN.

Vamos assumir este exemplo:

SELECT * FROM produto
INNER JOIN favoritos ON produto.cod_produto = favoritos.cod_produto

Quando pretendes relacionar duas tabelas (tabela Produto e tabela Favoritos) tens de ter algum campo que as ligue, neste caso, o campo é cod_produto.

O INNER JOIN permite-te selecionar todos registos da tabela da esquerda (Produto) que existem na tabela da direita (Favoritos), ou seja, lista-te aqueles registos que existem em ambas as tabelas.

O LEFT JOIN permite-te selecionar todos os registos da tabela da esquerda (Produto) quer existam ou não na tabela da direita (Favoritos).

Se existirem na tabela da direita, os campos referentes a Favoritos irão aparecer preenchidos.

Se não existirem os campos vão aparecer a NULL.

O RIGHT JOIN é semelhante ao LEFT JOIN, porém permite-te selecionar todos os registos da tabela da direita (Favoritos) quer existam ou não na tabela da esquerda (Produtos).

Se existirem na tabela da esquerda, os campos referentes a Produtos irão aparecer preenchidos.

Se não existirem os campos vão aparecer a NULL.

Espero ter ajudado,


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Leudassdf

Olá,

Claro que sim!

Em primeiro lugar, antes de "falarmos" sobre LEFT ou RIGHT join, vamos "falar" de INNER JOIN.

Vamos assumir este exemplo:

SELECT * FROM produto
INNER JOIN favoritos ON produto.cod_produto = favoritos.cod_produto

Quando pretendes relacionar duas tabelas (tabela Produto e tabela Favoritos) tens de ter algum campo que as ligue, neste caso, o campo é cod_produto.

O INNER JOIN permite-te selecionar todos registos da tabela da esquerda (Produto) que existem na tabela da direita (Favoritos), ou seja, lista-te aqueles registos que existem em ambas as tabelas.

O LEFT JOIN permite-te selecionar todos os registos da tabela da esquerda (Produto) quer existam ou não na tabela da direita (Favoritos).

Se existirem na tabela da direita, os campos referentes a Favoritos irão aparecer preenchidos.

Se não existirem os campos vão aparecer a NULL.

O RIGHT JOIN é semelhante ao LEFT JOIN, porém permite-te selecionar todos os registos da tabela da direita (Favoritos) quer existam ou não na tabela da esquerda (Produtos).

Se existirem na tabela da esquerda, os campos referentes a Produtos irão aparecer preenchidos.

Se não existirem os campos vão aparecer a NULL.

Espero ter ajudado,

ola,

Ajudou em muito, agora já percebi o que é que cada um faz.

Muito obrigada

Cumprimentos

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.