Este documento fornece várias curiosidades sobre o PostgreSQL, resumidas em 3 frases:
1) O documento apresenta diversos truques e funcionalidades avançadas do PostgreSQL, incluindo o uso de funções aninhadas, manipulação de datas e NULLs, e formas alternativas de escrever consultas.
2) Também mostra como usar recursos como o PSQL para facilitar a execução de consultas, como variáveis e conexões, e discute conceitos como serials e operadores.
3) Por fim, incentiva o leitor a apre
18. ai você vê isso …
SELECT(SELECTCOUNT(*)FROMchequeWHEREsituacao='compen
sado')astotal_compensados,
(SELECTCOUNT(*)FROMchequeWHEREsituacao='devolv
ido') astotal_devolvidos,
(SELECTCOUNT(*)FROMchequeWHEREsituacao='voador
') astotal_voadores
;
19. mas esperava isso …
SELECTSUM(CASEWHENsituacao='compensado'THEN1ELSE0E
ND)astotal_compensados,
SUM(CASEWHENsituacao='devolvido' THEN1ELSE0E
ND)astotal_devolvidos,
SUM(CASEWHENsituacao='voador' THEN1ELSE0E
ND)astotal_voadores
FROMcheque;
20. Ei! isso também é possível
SELECTSUM(int4(situacao='compensado'))astotal_compe
nsados,
SUM(int4(situacao='devolvido' ))astotal_devol
vidos,
SUM(int4(situacao='voador' ))astotal_voado
res
FROMcheque;
22. Outros CASTs que funcionam
SELECTtext(1); =>'1'
SELECTdate'2014-01-01';=>'2014-01-01'
SELECTnumeric'1';=>1
SELECTint4'100000000000000';=>outofrange
SELECTint8'100000000000000';=>100000000000000
23. Então da para fazer algo assim
SELECTSUM(int4(situacao='compensado'))astotal_compe
nsados,
SUM(int4(situacao='devolvido' ))astotal_devol
vidos,
SUM(int4(situacao='voador' ))astotal_voado
res
^^^^^^^^^^^^^,^^^^^^^^^^
FROMcheque; `~~~~~~~~~~´~~~~~transformabooleanparainte
ger
24. Mas qual é "o" problema?
todos os cheque acima de R$ 1.000,00 foram compensados?
algum cheque abaixo de R$ 800,00 foi devolvido?
25. Declarativo e explicito MELHOR QUE
implícito.
SELECT
BOOL_AND(situacao='compensado')FILTER(WHEREvalor>
1000)as"todos>1000foramcompensados?",
BOOL_OR(situacao='devolvido') FILTER(WHEREvalor<
800)as"algum<800foidevolvido",
EVERY(situacao='voador') as"algumchequevoado
r?"
FROMcheque;
SELECTbool_and(situacao='compensado')as"todoscompensad
osacimadeR$1.000"
FROMcheque
WHEREvalor>1000;
SELECTbool_or(situacao='devolvido')as"Algumcheque<80
0devolvido?"
FROMcheque
WHEREvalor<800;
70. Uma função pode ser chamada assim
SELECTupper('nome');
upper
-------
NOME
(1registro)
71. Uma função pode ser chamada assim
também
SELECT*FROMupper('nome');
upper
-------
NOME
(1registro)
72. E também pode ser assim
SELECT ('nome').upper;
upper
-------
NOME
(1registro)
73. Uma tabela comum, uma consulta comum
CREATETABLEpessoa(nometext,data_nascimentodate);
INSERTINTOpessoaVALUES('JOAO',now()-interval'35years
');
SELECTp.nome,p.data_nascimentoFROMpessoap;
74. e uma consulta não tanto comum
SELECTnome(p),data_nascimento(p)frompessoap;
nome|data_nascimento
------+-----------------
JOAO|1980-09-18
(1registro)
75. Mas uma função também pode ter seu
retorno como uma tabela
CREATEFUNCTIONduplica(INint,OUTvalor_originalint,OUT
valor_convertidotext)
AS
$$
SELECT$1,CAST($1AStext)||'ehtexto'
$$
LANGUAGESQL;
SELECT*FROMduplica(42);
valor_original|valor_convertido
----------------+------------------
42|42ehtexto
(1registro)
Tempo:1,684ms
85. Numa terça-feira monótona, Andrew
Gierth (a.k.a. RhodiumToad) escreveu isto
SELECToid,lowrite(lo_open(oid,131072),a)
FROM(VALUES(lo_create(0)))v(oid),
generate_bytea()asx(a)
;
--(notetheoidreturned)
lo_export828133392'image.png'
SELECTlo_unlink(828133392);
86. e é isso, obrigado! :)
Conferencia Brasileira de PostgreSQL
18 a 20 de Novembro
email: guedes@guedesoft.net
github:
twitter:
http://pgbr.postgresql.org.br/
http://github.com/guedes
http://twitter.com/guediz