Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Curiosidades que
você (talvez) não
sabia e se sabia …
Dickson S. Guedes
@guediz
PGBR 2015 - Porto Alegre, RS
O aninhador frenético
Problema
SELECT...,
CASEWHENsobrenomeISNULL
THENnome
WHENsobrenomeISNOTNULL
THENsobrenome||','||nome
END
FROM...
Solução
SELECT...,
COALESCE(sobrenome||',','')||nome
FROM...
O aninhador frenético II
Problema
SELECT...,
CASEWHENCOALESCE(endereco,'')<>''
THENCASEWHENCOALESCE(
COALESCE(endereco,'')||
''||
COALESCE(bairro,'...
Possível solução
SELECT...,
COALESCE(endereco||''||bairro,cidade,'SEMCIDADE
'),
FROM...
LEFTJOIN...
LEFTJOIN...
Opa! Três parâmetros?
SELECT...,
COALESCE(endereco||''||bairro,cidade,'SEMCIDADE
'),
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ ^^^^^^...
Qual é o resultado disto?
SELECT...,
COALESCE(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NU
LL,'SEMVALOR'),
COALESCE(NULL,NULL,NUL...
Como isso é possível?
VARIADIC
CREATEFUNCTIONmenor_de_todos(VARIADICvaloresnumeric[])
RETURNSnumericAS
$$
SELECTmin($1[valor])FROMgenerate_subsc...
Parâmetros! Não é para passar um ARRAY
não!
SELECTmenor_de_todos(ARRAY[10,11,12,30,-20,-30])asme
nor;
^^^^^^
`--assimdaruim
O esbanjador de SELECTs
Tudo bunitinho
CREATETYPEsituacao_chequeAS
ENUM('compensado','devolvido','sustado','voador')
;
CREATETABLEcheque(numeroint...
ai você vê isso …
SELECT(SELECTCOUNT(*)FROMchequeWHEREsituacao='compen
sado')astotal_compensados,
(SELECTCOUNT(*)FROMchequ...
mas esperava isso …
SELECTSUM(CASEWHENsituacao='compensado'THEN1ELSE0E
ND)astotal_compensados,
SUM(CASEWHENsituacao='devol...
Ei! isso também é possível
SELECTSUM(int4(situacao='compensado'))astotal_compe
nsados,
SUM(int4(situacao='devolvido' ))ast...
CAST
CAST('a'='b'ASint4)=0
int4('a'='b') =0
CAST('a'='a'ASint4)=1
int4('a'='a') =1
int4('B'='B')+int4('A'='A') =2
Outros CASTs que funcionam
SELECTtext(1); =>'1'
SELECTdate'2014-01-01';=>'2014-01-01'
SELECTnumeric'1';=>1
SELECTint4'1000...
Então da para fazer algo assim
SELECTSUM(int4(situacao='compensado'))astotal_compe
nsados,
SUM(int4(situacao='devolvido' )...
Mas qual é "o" problema?
todos os cheque acima de R$ 1.000,00 foram compensados?
algum cheque abaixo de R$ 800,00 foi devo...
Declarativo e explicito MELHOR QUE
implícito.
SELECT
BOOL_AND(situacao='compensado')FILTER(WHEREvalor>
1000)as"todos>1000f...
O explorador do desconhecido
NULL e a aritimética
SELECTNULL=NULL;
SELECTNULL>NULL;
SELECTNULL<NULL;
NULL e a aritimética
SELECTNULL=NULL;=>NULL
SELECTNULL>NULL;=>NULL
SELECTNULL<NULL;=>NULL
O que é NULL?
SELECTNULLISNULL; =>true
SELECTNULLISDISTINCTFROMNULL; =>false
SELECTNULLISNOTDISTINCTFROMNULL; =>true
SELEC...
TESTE DE ATENÇÃO!
Lembram da função menor_de_todos?
SELECTmenor_de_todos(10,11,12,30,-20,-30)asmenor;
menor
--------
-30
(1row)
E se eu passar NULL?
SELECTmenor_de_todos(10,11,12,NULL,-20,-30)asmenor;
menor
--------
?????
(1row)
-30
SELECTmenor_de_todos(10,11,12,NULL,-20,-30)asmenor;
menor
--------
-30
(1row)
menor_de_todos(...)usa a função
min(...)que é uma função de agregação
funções de agregação ignoram NULL
O fabricador de registros
Um registro!
SELECTROW(10,'JOAO',1500.50);
Dois registros!
SELECTROW(10,'JOAO',1500.50)=ROW(10,'JOAO',1500.50);
=>true
SELECTROW(10,'JOAO',1500.50)>ROW(9,'PEDRO',500...
NULL!
Lembra o INSERT?
INSERTINTO...VALUES(1,'JOAO',1500.10);
Pensa no VALUES!
/*INSERTINTO...*/VALUES(1,'JOAO',1500.10); --FUNCI
ONA!
VALUES é um comando sozinho!
INSERTINTO...SELECTcodigo,nome,valorFROMtabela_tempo
raria;
INSERTINTO...VALUES(1,'JOAO',1500...
O masoquista escrivinhador
SIM! Isto funciona; pode testar!
SELECT1OPERATOR(pg_catalog.+)2 =1+2; =>true
Operadores são funções disfarçadas
SELECT1+1;
^^^__integernadireita
||____operador'+'
|______integernaesquerda
SELECToprna...
Operadores são funções disfarçadas
SELECT1+1;
^^^__integernadireita
||____operador'+'
|______integernaesquerda
SELECToprna...
Logo …
SELECT1+1=2;
SELECTint4pl(1,1)=2;
Para o infinito, e além
Sim, tudo isso é possível
SELECT'+Infinity'::float>999999999999999999999
9999999999999999999999999999999999999999999999999...
Infinito para datas, também, claro!
SELECT'Infinity'::date>current_date;
=>true
INSERTINTOelemento(nome,validade)VALUES('u...
E tudo pode ser rescrito como …
SELECTdate'Infinity'>current_date;
=>true
INSERTINTOelemento(nome,validade)VALUES('urânio'...
NaNaNaNaNaNaNaN
SELECT'NaN'::numeric+1; => 'NaN'
Já que estamos falando de
datas
já viram isso?
SELECT...
CAST(
CAST(anoAStext)||'-'||
CAST(mesAStext)||'-'||
CAST(diaAStext),
ASdate)
),
...
FROM...;
ou isso?
SELECT...
FROM...
WHERE
...
data_nascimento=CAST(
CAST(anoAStext)||'-'||
CAST(mesAStext)||'-'||
CAST(diaAStext),
...
que se faça a data
SELECT...,
make_date(ano,mes,dia),
...
FROM...;
Algumas fontes são True Type
SERIAL NÃO!
São equivalentes
CREATETABLEtabela(
colunaSERIAL
);
OU
CREATESEQUENCEtabela_coluna_seq;
CREATETABLEtabela(
colunaintegerNO...
Chamando funções
Uma função pode ser chamada assim
SELECTupper('nome');
upper
-------
NOME
(1registro)
Uma função pode ser chamada assim
também
SELECT*FROMupper('nome');
upper
-------
NOME
(1registro)
E também pode ser assim
SELECT ('nome').upper;
upper
-------
NOME
(1registro)
Uma tabela comum, uma consulta comum
CREATETABLEpessoa(nometext,data_nascimentodate);
INSERTINTOpessoaVALUES('JOAO',now()-...
e uma consulta não tanto comum
SELECTnome(p),data_nascimento(p)frompessoap;
nome|data_nascimento
------+-----------------
...
Mas uma função também pode ter seu
retorno como uma tabela
CREATEFUNCTIONduplica(INint,OUTvalor_originalint,OUT
valor_conv...
PSQL
isso ajuda
setv_nome'JOAO'
setv_idade18
connectdesenvusuario192.168.1.15432
SELECT*FROMpessoaWHEREnome=:v_nomeANDidade>:v_...
isso também ajuda
setv_cpf1234567890
connectdesenvusuario192.168.1.15432
SELECTnome asv_nome,
idadeasv_idade
FROMpessoa
WH...
Talvez num futuro isso funcione
SELECT...FROMbanco.esquema.tabela;
Bom, não é só isso…
ainda tem muito mais coisas…
Leia o manual
http://www.postgresql.org/docs/manuals/
Visite o IRC, é divertido …
Numa terça-feira monótona, Andrew
Gierth (a.k.a. RhodiumToad) escreveu isto
SELECToid,lowrite(lo_open(oid,131072),a)
FROM(...
e é isso, obrigado! :)
Conferencia Brasileira de PostgreSQL
18 a 20 de Novembro
email: guedes@guedesoft.net
github:
twitte...
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar
Upcoming SlideShare
Loading in …5
×

Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar

854 views

Published on

Palestra ministrada no PGBR 2015 na Uniritter em Porto Alegre, RS, sobre curiosidades, funcionalidades e características do PostgreSQL que são interesantes e que valem à pena conhecer. Esta palestra também foi ministrada no PGDAY Curitiba, em Setembro de 2015.

Published in: Data & Analytics
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/yyxo9sk7 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Curiosidades que você (talvez) não sabia e se sabia vale a pena lembrar

  1. 1. Curiosidades que você (talvez) não sabia e se sabia … Dickson S. Guedes @guediz PGBR 2015 - Porto Alegre, RS
  2. 2. O aninhador frenético
  3. 3. Problema SELECT..., CASEWHENsobrenomeISNULL THENnome WHENsobrenomeISNOTNULL THENsobrenome||','||nome END FROM...
  4. 4. Solução SELECT..., COALESCE(sobrenome||',','')||nome FROM...
  5. 5. O aninhador frenético II
  6. 6. Problema SELECT..., CASEWHENCOALESCE(endereco,'')<>'' THENCASEWHENCOALESCE( COALESCE(endereco,'')|| ''|| COALESCE(bairro,'') )<>'' THENendereco||''||bairro ELSECOALESCE(cidade,'') END ELSECOALESCE(cidade,'SEMCIDADE') END FROM... LEFTJOIN... LEFTJOIN...
  7. 7. Possível solução SELECT..., COALESCE(endereco||''||bairro,cidade,'SEMCIDADE '), FROM... LEFTJOIN... LEFTJOIN...
  8. 8. Opa! Três parâmetros? SELECT..., COALESCE(endereco||''||bairro,cidade,'SEMCIDADE '), ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^ FROM... LEFTJOIN... LEFTJOIN...
  9. 9. Qual é o resultado disto? SELECT..., COALESCE(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NU LL,'SEMVALOR'), COALESCE(NULL,NULL,NULL,NULL,NULL,NULL,NULL,'S EMVALOR'), COALESCE(NULL,NULL,NULL,NULL,NULL,NULL,'SEMVAL OR'), COALESCE(NULL,NULL,NULL,NULL,NULL,'SEMVALOR'), COALESCE(NULL,NULL,NULL,NULL,'SEMVALOR'), COALESCE(NULL,NULL,NULL,'SEMVALOR'), COALESCE(NULL,NULL,'SEMVALOR'), COALESCE(NULL,'SEMVALOR'), ... FROM...
  10. 10. Como isso é possível?
  11. 11. VARIADIC CREATEFUNCTIONmenor_de_todos(VARIADICvaloresnumeric[]) RETURNSnumericAS $$ SELECTmin($1[valor])FROMgenerate_subscripts($1,1)g( valor); $$ LANGUAGESQL; SELECTmenor_de_todos(10,11,12,30,-20,-30)asmenor; menor -------- -30 (1row)
  12. 12. Parâmetros! Não é para passar um ARRAY não! SELECTmenor_de_todos(ARRAY[10,11,12,30,-20,-30])asme nor; ^^^^^^ `--assimdaruim
  13. 13. O esbanjador de SELECTs
  14. 14. Tudo bunitinho CREATETYPEsituacao_chequeAS ENUM('compensado','devolvido','sustado','voador') ; CREATETABLEcheque(numerointegernotnull, valor integernotnull, situacaosituacao_cheque); INSERTINTOchequeVALUES(1,100.00,NULL); INSERTINTOcheque VALUES(2, 500.00,'compensado'),(3,1000.00,'devolvi do'), (4, 900.00,'devolvido'),(5,3000.00,'compensa do'), (6, 145.00,'sustado'),(7, 45.00,'voador'), (8, 66.00,'voador'),(9, 96.00,'sustado'), (10, 45.00,'sustado') ;
  15. 15. ai você vê isso … SELECT(SELECTCOUNT(*)FROMchequeWHEREsituacao='compen sado')astotal_compensados, (SELECTCOUNT(*)FROMchequeWHEREsituacao='devolv ido') astotal_devolvidos, (SELECTCOUNT(*)FROMchequeWHEREsituacao='voador ') astotal_voadores ;
  16. 16. 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;
  17. 17. 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;
  18. 18. CAST CAST('a'='b'ASint4)=0 int4('a'='b') =0 CAST('a'='a'ASint4)=1 int4('a'='a') =1 int4('B'='B')+int4('A'='A') =2
  19. 19. Outros CASTs que funcionam SELECTtext(1); =>'1' SELECTdate'2014-01-01';=>'2014-01-01' SELECTnumeric'1';=>1 SELECTint4'100000000000000';=>outofrange SELECTint8'100000000000000';=>100000000000000
  20. 20. 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
  21. 21. Mas qual é "o" problema? todos os cheque acima de R$ 1.000,00 foram compensados? algum cheque abaixo de R$ 800,00 foi devolvido?
  22. 22. 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;
  23. 23. O explorador do desconhecido
  24. 24. NULL e a aritimética SELECTNULL=NULL; SELECTNULL>NULL; SELECTNULL<NULL;
  25. 25. NULL e a aritimética SELECTNULL=NULL;=>NULL SELECTNULL>NULL;=>NULL SELECTNULL<NULL;=>NULL
  26. 26. O que é NULL? SELECTNULLISNULL; =>true SELECTNULLISDISTINCTFROMNULL; =>false SELECTNULLISNOTDISTINCTFROMNULL; =>true SELECT1ISNULL; =>false SELECT1ISDISTINCTFROMNULL; =>true SELECT1ISNOTDISTINCTFROMNULL; =>false
  27. 27. TESTE DE ATENÇÃO!
  28. 28. Lembram da função menor_de_todos? SELECTmenor_de_todos(10,11,12,30,-20,-30)asmenor; menor -------- -30 (1row)
  29. 29. E se eu passar NULL? SELECTmenor_de_todos(10,11,12,NULL,-20,-30)asmenor; menor -------- ????? (1row)
  30. 30. -30 SELECTmenor_de_todos(10,11,12,NULL,-20,-30)asmenor; menor -------- -30 (1row)
  31. 31. menor_de_todos(...)usa a função min(...)que é uma função de agregação
  32. 32. funções de agregação ignoram NULL
  33. 33. O fabricador de registros
  34. 34. Um registro! SELECTROW(10,'JOAO',1500.50);
  35. 35. Dois registros! SELECTROW(10,'JOAO',1500.50)=ROW(10,'JOAO',1500.50); =>true SELECTROW(10,'JOAO',1500.50)>ROW(9,'PEDRO',500.50); =>true SELECTROW(1,'MARIA',1000.10)>ROW(1,'MARIA',1000.11); =>false SELECTROW(100,'JOANA',10.60)<ROW(100,'JOANA',NULL); =>?????
  36. 36. NULL!
  37. 37. Lembra o INSERT? INSERTINTO...VALUES(1,'JOAO',1500.10);
  38. 38. Pensa no VALUES! /*INSERTINTO...*/VALUES(1,'JOAO',1500.10); --FUNCI ONA!
  39. 39. VALUES é um comando sozinho! INSERTINTO...SELECTcodigo,nome,valorFROMtabela_tempo raria; INSERTINTO...VALUES(1,'JOAO',1500.10); VALUES (1,'...',1500.10), (2,'...', 500.00), (3,'...', 100.00), (4,'...', 50.50), (5,'...',3500.00), ;
  40. 40. O masoquista escrivinhador
  41. 41. SIM! Isto funciona; pode testar! SELECT1OPERATOR(pg_catalog.+)2 =1+2; =>true
  42. 42. Operadores são funções disfarçadas SELECT1+1; ^^^__integernadireita ||____operador'+' |______integernaesquerda SELECToprname, oprcode, CAST(oprleftASregtype), --23éinteger CAST(oprrightASregtype) --23éinteger FROMpg_operator WHEREoprname='+'ANDoprleft=23ANDoprright=23; oprname|oprcode|oprleft|oprright ---------+---------+---------+---------- + |int4pl |integer|integer
  43. 43. Operadores são funções disfarçadas SELECT1+1; ^^^__integernadireita ||____operador'+' |______integernaesquerda SELECToprname, oprcode, CAST(oprleftASregtype), --23éinteger CAST(oprrightASregtype) --23éinteger FROMpg_operator WHERE(oprname,oprleft,oprright)=('+',23,23); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `-esteéumoutrojeitodeescrever oWHEREsemosANDeobtero mesmoresultado... oprname|oprcode|oprleft|oprright ---------+---------+---------+---------- + |int4pl |integer|integer ^^^^^^.___opostgreschamaráestafunçãopara somarintegercominteger
  44. 44. Logo … SELECT1+1=2; SELECTint4pl(1,1)=2;
  45. 45. Para o infinito, e além
  46. 46. Sim, tudo isso é possível SELECT'+Infinity'::float>999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999; =>true SELECT'-Infinity'::float<999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 9999999999999999999999999999999999999999999999999 999999999999999999999999999999999999999999; =>true
  47. 47. Infinito para datas, também, claro! SELECT'Infinity'::date>current_date; =>true INSERTINTOelemento(nome,validade)VALUES('urânio','Infi nity'); istoéumdate_.^^^^^^^^ 1 SELECT'today'::interval=current_date; =>true SELECT'yesterday'::date='today'::date-interval'1day'; =>true SELECT'tomorroy'::date='today'::date+interval'1day'; =>true SELECTcurrent_date+'allballs'::time; =>'2015-09-1800:00:00'
  48. 48. E tudo pode ser rescrito como … SELECTdate'Infinity'>current_date; =>true INSERTINTOelemento(nome,validade)VALUES('urânio','Infi nity'); istoéumdate_.^^^^^^^^ SELECTinterval'today'=current_date; =>true SELECTdate'yesterday'=date'today'-interval'1day'; =>true SELECTdate'tomorroy'=date'today'+interval'1day'; =>true SELECTcurrent_date+time'allballs'; =>'2015-09-1800:00:00'
  49. 49. NaNaNaNaNaNaNaN SELECT'NaN'::numeric+1; => 'NaN'
  50. 50. Já que estamos falando de datas
  51. 51. já viram isso? SELECT... CAST( CAST(anoAStext)||'-'|| CAST(mesAStext)||'-'|| CAST(diaAStext), ASdate) ), ... FROM...;
  52. 52. ou isso? SELECT... FROM... WHERE ... data_nascimento=CAST( CAST(anoAStext)||'-'|| CAST(mesAStext)||'-'|| CAST(diaAStext), ASdate) ) ; ;
  53. 53. que se faça a data SELECT..., make_date(ano,mes,dia), ... FROM...;
  54. 54. Algumas fontes são True Type
  55. 55. SERIAL NÃO!
  56. 56. São equivalentes CREATETABLEtabela( colunaSERIAL ); OU CREATESEQUENCEtabela_coluna_seq; CREATETABLEtabela( colunaintegerNOTNULLDEFAULTnextval('tabela_coluna_s eq') ); ALTERSEQUENCEtabela_coluna_seqOWNEDBYtabela.coluna;
  57. 57. Chamando funções
  58. 58. Uma função pode ser chamada assim SELECTupper('nome'); upper ------- NOME (1registro)
  59. 59. Uma função pode ser chamada assim também SELECT*FROMupper('nome'); upper ------- NOME (1registro)
  60. 60. E também pode ser assim SELECT ('nome').upper; upper ------- NOME (1registro)
  61. 61. Uma tabela comum, uma consulta comum CREATETABLEpessoa(nometext,data_nascimentodate); INSERTINTOpessoaVALUES('JOAO',now()-interval'35years '); SELECTp.nome,p.data_nascimentoFROMpessoap;
  62. 62. e uma consulta não tanto comum SELECTnome(p),data_nascimento(p)frompessoap; nome|data_nascimento ------+----------------- JOAO|1980-09-18 (1registro)
  63. 63. 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
  64. 64. PSQL
  65. 65. isso ajuda setv_nome'JOAO' setv_idade18 connectdesenvusuario192.168.1.15432 SELECT*FROMpessoaWHEREnome=:v_nomeANDidade>:v_ida deg connecttesteusuario192.168.1.25432 SELECT*FROMpessoaWHEREnome=:v_nomeANDidade>:v_ida de;
  66. 66. isso também ajuda setv_cpf1234567890 connectdesenvusuario192.168.1.15432 SELECTnome asv_nome, idadeasv_idade FROMpessoa WHEREcpf=:v_cpfgset connecttesteusuario192.168.1.25432 SELECT* FROMpessoa WHEREnome=:v_nomeANDidade>:v_idade;
  67. 67. Talvez num futuro isso funcione SELECT...FROMbanco.esquema.tabela;
  68. 68. Bom, não é só isso…
  69. 69. ainda tem muito mais coisas…
  70. 70. Leia o manual http://www.postgresql.org/docs/manuals/
  71. 71. Visite o IRC, é divertido …
  72. 72. 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);
  73. 73. 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

×