Olá,
Existe duas funções embutidas na linguagem SQL que são úteis no nosso dia-a-dia.
São elas GREATEST e LEAST.
Abaixo vou dar alguns exemplos do uso delas ,e quem quiser pode deve usar do bom senso e fazer bom uso dessas funções em suas queries.
Vamos lá!
Abaixo irei fazer uma consulta para recuperar a maior data especificada.Para isso usarei a nossa tabela DUAL, que é muito útil nestes casos.
SQL> SELECT GREATEST(TO_DATE('20/12/2008','dd/mm/yyyy'),TO_DATE(SYSDATE'dd/mm/yyyy')) AS MAIOR_DATA FROM dual; MAIOR_DATA ----------- 20/12/2008 SQL>
Opa,a nossa consulta retornou a maior data como 20/12/2008,a SYSDATE é a data corrente 09/12/2008.Facil né?Ok.
E o maior número,será que funciona?
Vou fazer um teste com os números 8,20 e 50.
SQL> SELECT GREATEST(8,20,50) AS MAIOR_NUMERO FROM DUAL; MAIOR_NUMERO ------------ 50 SQL>
Show de bola,isso vai ajudar em muitos casos “dia afora”.
Será que funciona esse? Qual o menor número: 5 ou -100 ?
SQL> SELECT LEAST(5,-100) AS MENOR_NUMERO FROM DUAL; MENOR_NUMERO ------------ -100 SQL>
Congratulations Oracle ! rs.
E com dados tipo caracter?Como funciona.
Bom,isso vai depender de uma series de fatores por exemplo ,o character set do banco.
O Oracle faz as comparações de valores por dua formas de mediadas que chamados Binary or linguistic sorting e Blank-padded or nonpadded comparison semantics.
Não vamos entrar em detalhes sobre isso (para mais informações consulte a guide “Oracle Database Globalization Support Guide”.Todos nós sabemos que em se tratando de Oracle,temos assuntos para virar a noite rs.Então vamos por parte!
Por default o Oracle faz estas comparações por Binary or linguistic sorting. Nesta forma o Oracle faz a comparação baseada em uma tabela de cdigos numéricos para cada caracter,que por sinal é baseda no character set do banco. Sendo assim um character é maior que outro se o seu número dele na tabela de códigos é maior que o némero do outro caracter.Para saber o menor ,pense no inverso rs.
Uffa!
Um exemplo da tabelinha tirada da Globalization Support Guide.
1 Encoded Characters in the ASCII Character Set
Character | Description | Hexadecimal Code Value |
---|---|---|
! |
Exclamation Mark |
21 |
# |
Number Sign |
23 |
$ |
Dollar Sign |
24 |
1 |
Number 1 |
31 |
2 |
Number 2 |
32 |
3 |
Number 3 |
33 |
A |
Uppercase A |
41 |
B |
Uppercase B |
42 |
C |
Uppercase C |
43 |
a |
Lowercase a |
61 |
b |
Lowercase b |
62 |
c |
Lowercase c |
63 |
E assim sucessivamente !!!rs
Para fazer um” testzi’n” vejam:
SQL> SELECT GREATEST('!','#') FROM dual; GREATEST('!','#') ----------------- # SQL>
Curiosidade. Sabiam que o Oracle considera o “blank” ou seja “espaço em branco” como o menor caracter na regra de comparação?Isso mesmo,na maioria dos caso isso é verdade.
Vejam: SQL> SELECT LEAST(' ','A') FROM DUAL; LEAST(' ','A') ------------- SQL>
Ok?.Está em branco,porque …é um espaço em branco rs.
So,
SQL> SELECT LEAST('B','C') FROM DUAL; LEAST('B','C') -------------- B SQL>
Bom essa foia dica de hoje sobre GREATEST e LEAST.
O uso da função é simples , mas no caso de comparações entre campos do tipo caracter,temos que tomar cuidado sempre identificandoas configurações do character set do banco e etc.
Até o próximo post!
Sugestões ou dúvidas?Comente!
Assim eu poderei corrigir erros nas explicações ou aprender mais ainda com vocês!
Grato