Leudassdf Posted April 26, 2013 at 06:50 PM Report #504960 Posted April 26, 2013 at 06:50 PM 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
Rechousa Posted April 26, 2013 at 06:58 PM Report #504963 Posted April 26, 2013 at 06:58 PM (edited) 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 April 26, 2013 at 07:00 PM by Rechousa Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
Leudassdf Posted April 26, 2013 at 10:12 PM Author Report #504970 Posted April 26, 2013 at 10:12 PM 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
Leudassdf Posted April 26, 2013 at 11:15 PM Author Report #504973 Posted April 26, 2013 at 11:15 PM 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
Rechousa Posted April 27, 2013 at 12:01 AM Report #504981 Posted April 27, 2013 at 12:01 AM 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
Leudassdf Posted April 27, 2013 at 11:04 PM Author Report #505025 Posted April 27, 2013 at 11:04 PM 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
Rechousa Posted April 27, 2013 at 11:51 PM Report #505031 Posted April 27, 2013 at 11:51 PM 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
Leudassdf Posted April 28, 2013 at 10:08 AM Author Report #505043 Posted April 28, 2013 at 10:08 AM 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
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now