Translate

quarta-feira, 30 de outubro de 2013

Postgresql - Exemplo CASE WHEN

Case é uma expressão condicional, similar a if/else em outras linguagens de programação.
Abaixo serão descritos 3 exemplos da utilização do case em consultas.

No final do artigo, segue os links com um exemplo "bônus", de como utilizar o "CASE WHEN ANINHADO", ou seja, um "CASE WHEN" dentro de outro "CASE WHEN", caso seja necessário avaliar mais de uma condição.

1º Exemplo

Cenário: Serão distribuídos uniformes para times de futebol, de acordo com a seguinte regra:

  • O time "A" receberá uniforme da cor "Amarela";
  • O time "B" receberá uniforme da cor "Azul";
  • O time "C" receberá uniforme da cor "Vermelha";
Podemos ver a imagem da tabela "time_futebol":


Para aplicar esta regra, executamos a sentença abaixo: 

SELECT
time,
CASE
WHEN time = 'A' THEN 'Amarela'
WHEN time = 'B' THEN 'Azul'
WHEN time = 'C' THEN 'Vermelha'
END
AS cor_uniforme
FROM time_futebol;

Após a execução poderemos ver o resultado da distribuição das cores dos uniformes na imagem abaixo:

Significado

SELECT
time,
/*Inicie a condição com CASE*/
CASE                                                   
/*Quando o time for o A então receberá uniforme da cor Amarela*/
WHEN time = 'A' THEN 'Amarela'
/*Quando o time for o B então receberá uniforme da cor Azul*/
WHEN time = 'B' THEN 'Azul'
/*Quando o time for o C então receberá uniforme da cor Vermelha*/
WHEN time = 'C' THEN 'Vermelha'
/*Termine a condição com END*/
END                                                      
/*após os "AS" colocamos o nome da nova coluna que será exibida, ou seja cor_uniforme*/
AS cor_uniforme
FROM time_futebol;

Observações
  • Inicie a condição com CASE;
  • coloque WHEN para iniciar uma condição;
  • após o THEN colocamos o resultado da condição se ela for verdadeira;
  • coloque END para finalizar a condicão;
  • após o AS colocaremos o nome da nova coluna que será exibida;
2º Exemplo

Cenário: queremos classificar o desempenho de cada aluno de acordo com a sua nota. Utilizaremos a seguinte regra:
  • se a nota for maior ou igual a  8.0 é ótimo;
  • se a nota for maior ou igual a  6.0 é bom;
  • se a nota for maior ou igual a  4.0 é regular;
  • se a nota for maior ou igual a  2.0 é ruim;
  • senão será péssimo
Podemos ver a imagem da tabela "tb_nota":


Para aplicar esta regra, executamos a sentença abaixo:

SELECT
aluno,
nota,
CASE
WHEN nota >= 8.0 THEN 'ótimo'
WHEN nota >= 6.0 THEN 'bom'
WHEN nota >= 4.0 THEN 'regular'
WHEN nota >= 2.0 THEN 'ruim'
ELSE 'péssimo'
END
AS desempenho
FROM tb_nota;

Após a execução poderemos ver o resultado do desempenho na imagem abaixo:

Significado:

SELECT
aluno,
nota,
/*Inicie a condição com CASE*/
CASE
/*se a nota for maior ou igual a  8.0 o desempenho é ótimo*/
WHEN nota >= 8.0 THEN 'ótimo'
/*se a nota for maior ou igual a  6.0 o desempenho é bom*/
WHEN nota >= 6.0 THEN 'bom'
/*se a nota for maior ou igual a  4.0 o desempenho é regular*/
WHEN nota >= 4.0 THEN 'regular'
/*se a nota for maior ou igual a  2.0 o desempenho é ruim*/
WHEN nota >= 2.0 THEN 'ruim'
/*senão é péssimo*/
ELSE 'péssimo'
/*Termine a condição com END*/
END
/*após os "AS" colocamos o nome da nova coluna que será exibida, ou seja desempenho*/
AS desempenho
FROM tb_nota;

3º Exemplo

Cenário: Com base na tabela "tb_nota". Queremos saber...



Quantos alunos tiveram um desempenho ótimo?
Quantos alunos tiveram um desempenho bom?
Quantos alunos tiveram um desempenho regular?
Quantos alunos tiveram um desempenho ruim?
Quantos alunos tiveram um desempenho péssimo?

Classificação do desempenho
  • se a nota for maior ou igual a  8.0 o desempenho é ótimo;
  • se a nota for maior ou igual a  6.0 o desempenho é bom;
  • se a nota for maior ou igual a  4.0 o desempenho é regular;
  • se a nota for maior ou igual a  2.0 o desempenho é ruim;
  • senão será péssimo
Para aplicar esta regra, executamos a sentença abaixo:

SELECT
CASE
WHEN nota >= 8.0 THEN 'ótimo'
WHEN nota >= 6.0 THEN 'bom'
WHEN nota >= 4.0 THEN 'regular'
WHEN nota >= 2.0 THEN 'ruim'
ELSE 'péssimo'
END AS desempenho,
COUNT(*) AS quantidade
FROM tb_nota
GROUP BY desempenho
ORDER BY desempenho;



Após a execução poderemos ver o resultado do desempenho na imagem abaixo:






Significado:

SELECT
/*Inicie a condição com CASE*/
CASE
/*se a nota for maior ou igual a  8.0 o desempenho é ótimo*/
WHEN nota >= 8.0 THEN 'ótimo'
/*se a nota for maior ou igual a  6.0 o desempenho é bom*/
WHEN nota >= 6.0 THEN 'bom'
/*se a nota for maior ou igual a  4.0 o desempenho é regular*/
WHEN nota >= 4.0 THEN 'regular'
/*se a nota for maior ou igual a  2.0 o desempenho é ruim*/
WHEN nota >= 2.0 THEN 'ruim'
/*senão é péssimo*/
ELSE 'péssimo'
/*Termine a condição com END*/
END
/*após os "AS" colocamos o nome da nova coluna que será exibida, ou seja desempenho*/
AS desempenho,
/*A função COUNT faz a contagem por desempenho, ou seja quantos tiveram desempenho bom, ruim, etc
*Chamamos a coluna que exibirá a contagem de quantidade.
*/
COUNT(*) AS quantidade
FROM tb_nota
/*agrupa os desempenhos*/
GROUP BY desempenho
/*ordena a coluna desempenho em ordem alfabética*/
ORDER BY desempenho;

4º Exemplo

Classificar os alunos de acordo com o sexo e com a nota.

Neste exemplo, vamos utilizar, o "CASE WHEN ANINHADO", para classificarmos mais de uma condição dentro do "CASE WHEN"
Veja o script com o exemplo e a visualização no: github (está página carrega mais rápido em conexões lentas) ou no sqlfiddle.

terça-feira, 29 de outubro de 2013

INSERT INTO SELECT

Utilizando sql, você pode copiar dados de uma tabela para uma outra tabela.
Para facilitar a compreensão da utilização do "INSERT INTO SELECT", vamos descrever um exemplo:
Cenário: uma loja quer fazer uma promoção para os produto que vão vencer até o dia 28/11/2013.
No nosso banco temos duas tabelas: "tb_produto" e "tb_vencimento".
A tabela "tb_produto" possui informações sobre os produtos e a tabela "tb_vencimento" inicialmente está vazia. Veja a imagem abaixo:

tb_produto

tb_vencimento

Selecionaremos os produtos da tabela "tb_produto" que vão vencer até o dia 28/11/2013 e incluiremos na tabela "tb_vencimento" 

Para efetuar este procedimento executaremos a sentença abaixo:

INSERT INTO tb_vencimento (produto_id, produto_desc, data)
SELECT produto_id, produto_desc, produto_vencimento FROM tb_produto 
WHERE produto_vencimento <= '2013-11-28';

Significado da sentença:
  • Insira nas colunas produto_id, produto_desc e data da tabela tb_vencimento           INSERT INTO tb_vencimento (produto_id, produto_desc, data)
  • O conteúdo das colunas produto_id, produto_desc e produto_vencimento da tabela "tb_produto"                                                                                                       SELECT produto_id, produto_desc, produto_vencimento FROM tb_produto
  • Onde a data de vencimento seja menor ou igual a 28/11/2013  WHERE produto_vencimento <= '2013-11-28'

Após a execução a tabela "tb_vencimento" já conterá os produtos que vão vencer até o dia 28/11/2013. Veja a imagem abaixo:

segunda-feira, 28 de outubro de 2013

Exibir uma lista das tabelas de um banco no PostgreSQL

Há três formas para exibir uma lista com as tabelas de um banco no PostgreSql :

1ª) Comando psql: você pode utilizar o comando \dt 
Neste exemplo, vamos listar as tabelas do banco: db_01



2ª) Utilizar a view "pg_tables" para fazer uma consulta. Esta view armazena informações sobre as tabelas do banco e já está por padrão no catálogo de sistema do postgresql. Veja a sua localização na imagem abaixo:



A consulta para listar as tabelas (inclusive as que são padrão do sistema) é:
SELECT tablename FROM pg_tables ORDER BY tablename;

Caso queira listar somente as tabelas criada por você, faça um filtro no schema, neste exemplo só foram criadas tabelas no schema "public" que é padrão do postgresql. Veja a imagem abaixo:


A consulta para lista somente suas tabelas é

SELECT tablename FROM pg_tables
WHERE schemaname = 'public'  
ORDER BY tablename;

3ª) Utilizar a view "tables" para listar suas tabelas. Esta view já está por padrão no catálogo de sistema do postgresql em information_schema.

O information_schema é um padrão ANSI, que contém views que fornecem informações sobre o banco de dados: tabelas, views, colunas e procedures. 

Veja a sua localização na imagem abaixo:





SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

domingo, 27 de outubro de 2013

Exibir uma lista dos bancos de dados no PostgreSQL

Há duas formas para exibir uma lista com os bancos de dados do PostgreSql :

1ª) Comando psql: você pode utilizar o comando \list ou \l
Neste exemplo serão listados 3 bancos: db_01, db_02 e db_03;






2ª) Fazer uma consulta na tabela "pg_database" que armazena informações sobre os bancos de dados criados. Esta tabela já vem por padrão na instalação e está localizada no catálogo do sistema. 
O catálogo armazena informações sobre os  bancos de dados, tabelas, colunas, índices entre outros.  Veja a imagem abaixo:


A consulta para listar os bancos dados é:


SELECT datname FROM pg_database;



Também é possível filtrar os bancos de acordo com o nome. Veja os exemplos abaixo:

1º)  Bancos que iniciam com db

SELECT datname FROM pg_database  WHERE datname LIKE 'db%';



2º)  Bancos que terminam com 01

SELECT datname FROM pg_database  WHERE datname LIKE '%01';


3º) Bancos que contém com b_0, em qualquer posição:

SELECT datname FROM pg_database WHERE  datname LIKE '%b_0%';



4º) Banco chamado db_02

SELECT datname FROM pg_database WHERE  datname LIKE 'db_02';

OU

SELECT datname FROM pg_database WHERE  datname = 'db_02';


quinta-feira, 24 de outubro de 2013

PostgreSql - Importar arquivo csv e txt

Vamos supor que precisamos importar para a tabela "tb_esporte" os dados do arquivo "'C:/temp/arq_esporte.csv'". Conforme imagem a seguir:


Tabela: tb_esporte

Arquivo: arq_esporte.csv

Para importar o arquivo utilizamos o comando sql COPY e o arquivo deve estar armazenado no servidor do banco de dados. 
Caso você precise acessar remotamente um arquivo, ou seja, o arquivo está em uma outra máquina você deve utilizar o comando psql \copy. Acesse o link em:


COPY tb_esporte
(
    id,
    esporte_desc,
    disponibilidade
)
FROM 'C:/temp/arq_esporte.csv'
DELIMITER ';'
CSV HEADER;

Significado:
  • COPY: comando utilizado para importar a tabela;
  • tb_esporte: nome da tabela que receberá os dados;
  • (...):  dentro do parenteses colocamos as colunas que receberão os dados. Neste caso, utilizamos as colunas id, esporte_desc  e disponibilidade;
  • FROM: após o "FROM" devemos colocar o diretório que está localizado o arquivo. O diretório sempre deve usar "/", nunca "\", tanto para Windows quanto para LinuxO arquivo que será importado tem a extensão csv, também poderiamos importar um arquivo com a extensão "txt";
  • DELIMITER: após o delimiter devemos colocar o separador que o arquivo utiliza. O separador poder ser ";", ",", "|" entre outros. Neste caso,  o separador do arquivo é ";" ;
  • CSV HEADER: utilize "CSV HEADER" caso não queira importar a primeira linha. Para este arquivo não importamos a primeira linha, pois é o cabeçalho;

Para visualizar a tabela com os dados importados execute um select:

SELECT * FROM  tb_esportes;

Veja o resultado na imagem abaixo.


Possíveis problemas com a codificação

Se a codificação do arquivo for diferente do seu banco, pode ocorrer um erro e o seu arquivo não ser importado. Exemplo: se o seu arquivo tiver a codificação "ANSI" e o da sua tabela tiver a codificação "UTF-8". A mensagem de erro exibida será:

ERRO:  sequência de bytes é inválida para codificação "UTF8": 0xe7e36f

Para resolver este erro você poder salvar o arquivo com a codificação "UTF-8". No campo "tipo" escolha a codificação "UTF-8" e depois pressione o botão Salvar. Veja a imagem abaixo.






A versão do PostgreSql utilizada neste exemplo é a 9.0.