Como dar um order by em um campo que é varchar porem ordenando como se fossem numeros?

12 respostas
T

Galera como eu vou um order byem um campo varchar porem que so possui numero ex:

id  - int
nome - varchar
dsNumNome - varchar

quero fazer um select assijm:

select * tabela order by dsNumNome

porem se fizer essa query e nao informando que e para ser tratado como numero o sistema nao entendera que 1000 é maior que 11 pois quando comparado em varchar ele entendi que 1000 vem antes de 11, entendera?

Alguem por me ajudar?

Vlw

12 Respostas

E

a) Troque o tipo do campo para numérico.
b) Dependendo do banco é possível criar uma “pseudo-coluna” que é o resultado de um cálculo. Você poderia ordenar o resultado por essa pseudo-coluna.

c) Por favor, evite o uso de “*” no select. Liste apenas os campos que irão ser usados na query.

R

Olha, a solução é simples… qdo fizer o order by, vc manda ordenar pelo campo CONVERTIDO pra número, e pronto! Tudo fica certinho.

Pra passar a sintaxe exata pra vc, preciso saber qual o BD que vc está usando. Por ex, se for MySQL, vai ficar assim:

Claro que vc tem que ter certeza que o conteúdo de dsNumNome será sempre números (apesar de estar no formato string), senão vai dar erro.

Me passe qual Bd vc está usando que eu te ajudo.

R

Perfeiro RenataFA sua resposta, apenas complementando um pouco…

Para banco Sql server ou Oracle use NUMERIC.

T

Galera eu tentei

SELECT * FROM tabela t ORDER BY CAST(dsNumNome  as NUMERIC)

Deu o seguinte erro:

ORA-01722: invalid number

SELECT * FROM tabela  ORDER BY CAST(t.dsNumNome  as NUMERIC)
T

galera ate rolou porem se tiver algum com letras cadastrada ele da erro, como faria para caso venha algum com letra ele nao trazer nada…

E

Crie uma FUNCTION no Oracle que faça isso por você, ou procure uma pronta. Deve haver alguém que já deve ter feito isso (ordenação de strings que é numérica se a string começar por número), portanto é questão de procurar.

Um site interessante para o Oracle: Ask Tom

Exemplo:

Complicated sorting required

Qualquer dúvida, pergunte ao Tom Kyte.

R

Qual o tamanho do seu campo dsNumNome ?

R

Bom aqui usando Oracle 10g XE no ubuntu funciona o numeric, bom tenta com integer e usa o regexp_replace para retirar as letras, seria mais ou menos isso.

T

entao galera…nao ta rolando quando tento usar a query no TOPLINK tipo eu mando a query ele nao ta entendendo o primeiro parentes depois do CAST, sera que o EJBQL nao entendi essa funcao ou é feita de forma diferente?

E

EJBQL != SQL , portanto não entende essas coisas específicas do Oracle.

T

iii lasco entao kkkkkk

Sera que tem algo parecido para o EJBQL?

P

Fiquei com uma duvida: como é o uso de expressões regulares no sql/oracle? deteriora muito a performance?

rodrigo_corinthians, pq vc usou classes POSIX? Funciona bem com diferentes encodings? Tem alguma diferença pras expressões perl-like tipo \w \W \s etc… ?

Criado 6 de outubro de 2009
Ultima resposta 6 de out. de 2009
Respostas 12
Participantes 5