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 »





Case When SQL / Postgres

10 10 2008

Saudações

Não o Battisti não morreu, apenas diminui a quantidade de posts pois nos últimos dias tenho encarados desafios realmente desafiadores, inclua nesse bolo o aprendizado de uma nova linguagem de programação, é meus amigos estou começando a mexer com Java pra Web, sendo assim, não se assustem se nesse santuário do PHP começarem a pipocar posts sobre Java :).

Sobre o CASE WHEN é o seguinte: tenho tentado fazer mais coisas via SQL a fim de otimizar um pouco o desempenho dos sistemas e nisso aprendi a usar esse cara, ai vai um exemplo:

SELECT
   cod,
   data
   case
      when tipo = 1 then 'Abacate'
      when tipo = 2 then 'Abobrinha'
   end as nome
FROM vegetais

Isso ai é um If disfarçado :), vc pode fazer coisas mais complexas como por exemplo fazer uma outra SQL dentro do THEN de acordo com os dados que venham de um campo, exemplo:

SELECT
   cod,
   data
   case
      when tipo = 1 then
      select valor from abacate
      when tipo = 2 then
      select valor from abobrinha
   end as valor
FROM vegetais

Nesse caso o valor da abobrinha e do abacate são armazenados em tabelas separadas então de acordo com o tipo o valor deve vir de sua respectiva tabela.

Bom é isso ai. Bom Sorte até mais e tchau!





Calculando a Idade via Postgres

17 09 2008

Problema

Quero sabe a idade dos meus clientes!

Solução

SELECT
      extract(year from age(pessoa.pss_nascimento))
FROM pessoa

A coluna pss_nascimento deve ser do tipo date, caso não seja será necessário converte usando o comendo timestamp vide referência

Referência

http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Internas/Data_e_Hora





Rules Postgres & UML com Dot

26 02 2008

Traduzindo literalmente rules são regras, ou seja alguma coisa que sempre vai acontecer em função de outra coisa, por exemplo, sempre que tem jogo de futebol aumenta o nível de stress da minha esposa, isso é uma regra, bom lá em casa pelo menos é :).

Quando falamos de banco de dados as regras são coisas muito úteis, por exemplo, veja a figura abaixo:

classe.png

Continue lendo »





Rapidinha do Postgres – JDBC Postgres

15 02 2008

A URL de conexão JDBC para um banco postgres é:

jdbc:postgresql://ip-do-servico/nome-do-banco

Um bom plugin do eclipse para manipular base de dados é o SQL Explorer.

O Driver JDBC do postgres pode ser obtido neste endereço, quando for baixar preste muita atenção na versão do seu postgres porque se você pegar a versão errada há grandes chances da conexão não funcionar.





Having Mysql

13 02 2008

Consulta para listar todos os e-mail duplicados em uma tabela, mas serve para qualquer coluna.

SELECT
   email
FROM tabela
GROUP BY email
HAVING count(email) > 1
ORDER BY email




Converter Formato Data Postgres e Mysql

12 02 2008

Para converter o formato de um campo do tipo data no postgres use o comando to_char, exemplo:

SELECT
   to_char(nome_campo, 'MM/DD/YYYY') as nome_campo
FROM tabela

Isso irá retornar a data no formado mês/dia/ano.

Meu amigo Anderson deu a dica de como converter datas via SQL no Mysql

SELECT
   DATE_FORMAT(nome_campo, '%d/%m/%Y') as nome_campo
FROM tabela




Concatenar Duas Colunas no Postgres / Sql Server / MySQL

1 09 2007

No Postgres

Para concatenar duas colunas no postgres, ou duas strings utilize ||

SELECT  colunaA || colunaB as colunaAB FROM tabela

Contribuição do meu amigo Ivan:

Se você tiver uma coluna que possa ter um valor nulo então é necessário utilizar o operador coalesce pois NULL concatenado com qualquer coisa dá NULL.

SELECT (coalesce((colunaA),'') || coalesce((colunaB),'')) AS colunaAB FROM tabela

Caso seja necessário concatenar colunas do tipo int então será necessário antes disso converter os

coalesce(cast(colunaA as varchar),'') || coalesce(cast(colunaB as varchar), '') as colunaAB

No SQL Server

O sinal de + é usado para concatena strings, desta forma:

SELECT coluna1 + coluna2 as coluna12 FROM tabela

irá concatenar a coluna1 com a coluna2.

Caso sua coluna seja de um tipo diferente, inteiro ou float por exemplo será necessário fazer um cast desta forma:

SELECT  (cast(coluna1 as varchar) + ' - ' +  cast(coluna2 as varchar)) as coluna12   FROM tabela

Caso uma coluna puder ser nula então use o IsNul(coluna1,’ ‘) para trocar seu valor nulo por um espaço pois lembrem-se nulo com qualquer coisa é sempre nulo.

No MySQL

SELECT concat(coluna1,’ – ‘,coluna2) FROM tabela

coalesce(cast(funcionario_associado.ass_cod as varchar),”) || coalesce(cast(fa.ass_cod as varchar), ”) as ass_cod,




Desativar Integridade do Postgres

3 08 2007

Saudações

Parece estranho o título, para que alguém em sã consciência vai desativar a INTEGRIDADE do Postgre. Mas, em momentos de atualização de dados vindos de outros bancos ou em testes em que você não está preocupado se tem a maldadita FK faça o seguinte:

Para desativar

UPDATE "pg_class" SET "reltriggers" = 0 WHERE "relname" = 'tabela';

Para Ativar

UPDATE pg_class SET reltriggers =
(
SELECT count(*) FROM pg_trigger WHERE pg_class.oid = tgrelid
)
WHERE relname = 'tabela';