GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Usando GREATEST e LEAST

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

Share

Deixe um comentário

O seu endereço de e-mail não será publicado.