Alternativa ao NOT IN com LEFT JOIN Postgres

25 04 2009

Introdução

Manipular tabelas via SQL é uma arte,  existem diversas formas de fazer a mesma coisa, veja as tabelas abaixo:

+------------+
|   USUARIO  |
+------------+
| usr_cod    |
| usr_login  |
| pss_co     |
+------------+
+------------+
|   PESSOA   |
+------------+
| pss_cod    |
| pss_nome   |
+------------+

O objetivo é descobrir quais pessoas ainda NÃO possuem usuários. Eu resolveria este problema da seguinte forma. Continue lendo »





Postgres CPanel LATIN1

24 02 2009

Introdução

Quem já usou postgres juntamente com o CPanel sabe que o suporte que o CPanel oferece é bem fraquinho, tanto que até poucas versões atraz a criação de banco via CPanel estava bugada! ou seja, para se criar banco era necessário usar a boa e velha SQL para criar o banco e dar permissões aos usuários, quanto a isso não há problema algum, o X da questão é que ao se fazer isso todos os benefícios que o CPanel oferece como Backup, Controle de Disco e Permissões de Execução simplesmente não funcionam, e pior quando você vai migrar uma conta entre servidores o o outro o CPanel não copia as bases de dados que são geradas manualmente!

Na versão 11 do Cpanel estes problemas finalmente foram corrigidos mas ai apareceu outro, é como diz meu amigo @lfenciso.

– Se fosse fácil não seria um problema!

Quando você cria um banco Postgres via CPanel o ENCODING do mesmo fica com UTF8 aparentemente não tem como mudar isso! no nosso caso o  sistema roda usando um banco LATIN1 e ai José? Baita problemão.

Solução

Para resolver este problema sem ter que mexer nas configurações do CPanel ou ainda atualizar o sistema fizemos o seguinte:

  1. Criamos o banco com UTF8
  2. Importamos o backup do banco que estava sendo usado pelo cliente que é LATIN1
  3. Como era de se esperar os caracteres com acento por exemplo estavam todos quebrados, para resolver isso:
  4. Na classe que é usada para esabelecer a conexão com o banco de dados dados execute!
  5. SET CLIENT_ENCODING TO ‘LATIN1’

Conclusão

Dessa forma o postgres automatigamente converte tudo o que vai da aplicação para o banco de LATIN1 -> UTF8 e tudo que vem do banco para aplicação de UTF8->LATIN1.

O ideal é sempre ter a aplicação e o banco trabalhando com o mesmo encoding porém no nosso caso isso não era possível então foi necessário o uso deste artifício do postgres.

[]’s Anselmo Battisti





Calcular o Último Dia do Mês

19 01 2009

Introdução

Precisava calcular quantos anos uma pessoa teria no último dia do mês.  Para calcular a idade em função de uma outra data basta fazer o seguinte:

select extract(year FROM age(current_date,to_date('01/01/2000','DD/MM/YYYY')))

Continue lendo »





Calcular Diferença em Timestamp no Postgres

10 12 2008

O Problema

Descobrir a  quantidade de dias e horas que se passaram entre dois timestamp. Continue lendo »





Postgres – LPAD AVG Date_Part e Cast

26 11 2008

O Problema

Com base em uma tabela meu cliente necessitava extrair um relatório com as notas médias mensais que ele estava recebendo dos seus clientes. Continue lendo »





Selecionar Registros Duplicados – SQL

18 11 2008

Problema

Haviam algumas empresas com cadastros duplicados e eu queria saber quais eram elas.

Solução

SELECT
    emp_cnpj,
    count(*)
FROM empresa
WHERE
   emp_cnpj <> ''
GROUP BY emp_cnpj
HAVING COUNT(*) > 1




UPDATE com CASE WHEN POSTGRES

28 10 2008

Saudações a todos

Nos últimos como vocês sabem tenho tentado fazer o máximo de coisas possíveis usado SQL, estou surpreso com o que é possível ser feito só com SQL.

O Problema

Tinha que alterar o tipo de uma coluna de boolean para integer, facil né:

ALTER TABLE tabela ALTER COLUMN a TYPE integer

porém 😦

ERROR: column "a" cannot be cast to type "pg_catalog.int4"

Os tipos não são compatíveis. Continue lendo »