Ordenação no Oracle

Alguem sabe como consigo armazenar uma tabela no oracle com valores ordenados. Por exemplo, sejam os dados: ano 1, ano 2, ano 10, ano 5
Deverá ser armazenado no banco: ano 1, ano 2, ano 5, ano 10.

Quando um select for feito devera retorna as tuplas já ordenadas. Verifique que deve considerar strings com letra e numero.

e pra que guardar ordenado??? basta dar um order by no select!! no maximo criar um indice crescente para o campo no oracle!!!

um select sem order by não necessariamente vai mostrar do inicio ao fim de uma tabela…

Hoje já uso o order By. O problema é que ele parece considerar ordenação ASCII. E eu preciso que o select já me devolva a ordenação considerando texto e número.

Desde jeito: ano 1 , ano 2, ano 10 e não ano 1, ano 10, ano 2

Tem como setar o ORDER BY para ele ordenar considerando número e texto?

vc podia ter algo assim

ano 01
ano 02

ano 10

ou vc podia usar a função ‘regexp_replace’ para remover todos os caracteres que não são numeros.

select … order by regexp_replace(…)

http://www.adp-gmbh.ch/ora/sql/re/regexp_replace.html

[quote=aloizio]Hoje já uso o order By. O problema é que ele parece considerar ordenação ASCII. E eu preciso que o select já me devolva a ordenação considerando texto e número.

Desde jeito: ano 1 , ano 2, ano 10 e não ano 1, ano 10, ano 2

Tem como setar o ORDER BY para ele ordenar considerando número e texto?[/quote]

cara, vc ta armazenando a String “ano” no banco? aí ferra tudo… bom, tenta usar uma expressão para fazer um substring, pegando apenas a parte numerica da coluna, tranformar em um number e fazer o order by.

Mas a performace disso não sera das melhores. Se possível, tire esse “ano” daí.

Além disso que o microfilo falou, se for mesmo pra armazenar datas, PELAMORDESUAMÃE, use o tipo datetime. Ou se é mesmo pra armazenar somente o ano, use um campo do tipo integer mesmo. Já vi um sistema INTEIRO feito armazenando datas em um VARCHAR2(!!!) no formato 20011231 e acredite, isso DÓI no coração. Como o Lipe diria, um típico bambu desfiado.

Acho que vocês estão enganados. Na verdade eu tenho um objeto java em que um de seus atributos é “NOME”, este atributo é preenchido por um usuário na interface gráfica. Portanto o usuario pode dar o nome que quiser. Por exemplo: ab2c, ab45d, ano 1, ano 2 , ano 17.

Este objeto é armazenado no banco de dados Oracle. Existe uma outra interface em que todos os objetos são listados e ordenados pelo “NOME”.
Sendo assim preciso que o Oracle me retorne a ordenação considerando texto e número.

O peczenyj sugeriu usar “regexp_replace”, vou ver o que acontece.

Olá,

Nesse teu exemplo qual seria a ordenacao correta.

]['s

peczenyj você sugeriu ano 01 ano 02 … ano 10. Não atende pois o usuário pode entrar tanto com ano 1 quanto ano 02.

Alguma sugestão como poderia escrever uma expressão regular, para tratar isso junto ao order by do SQL?

Fabio

A ordenação correta seria:

ab2c, ab45d, ano 1, ano 2 , ano 17

exatamente essa.

Olá,

E tu ja penso que isso nao tem como o banco fazer? O teu campo é uma String ou no banco um VARCHAR2 e pro banco independente do que tem la dentro tudo é String e é assim que ele ordena por String.
O negocio é tua aplicacao tratar isso nao tem jeito.

]['s

Qual a ordem que vc espera desses campos:

ab2c, ab45d, ano 1, ano 2 , ano 17

Explique a sua lógica ?

Outra coisa, gravar ‘ano02’ quando o usuario inserir ‘ano2’ se chama ‘aplicar uma máscara aos dados inseridos’. um simples javascript ou uma expressão regular consegue lidar com isso :wink:

Não tem jeito mesmo, só tem 3 alternativas:

:arrow: trate isso na aplicação diferenciando número de texto

:arrow: treine o usuário para colocar a informação da maneira apropriada

:arrow: deixe como está e o resultado não será ordenado como o usuário espera