Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Leudassdf

[Resolvido] IF num select

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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,

Editado por Rechousa

Pedro Martins

Sharing is Knowledge!

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.