ordenar por texto como numero via sql

Delphi

06/04/2005

Oi

Uso Delphi 6 e paleta Interbase com Firebird 1.5

Como posso fazer para ordenar texto como se fosse numeros.
me sql é:
Select * from Orcamento where CodTipoDocumento = ´´´+´9´+´´´
order by Numero

onde esse numero é a nota fiscal ou o número do orçamento, só que o campo é utilizado em texto, por poder utilizar barras e traços. Mas quando o codtipodocumento é 9 ele é numerico e deveria ser sequencial, mas eu nao consigo ordenar corretamente, pois ao fazer essa ordenação ele erra sendo que por exemplo 34 vem antes do 104 na ordenação por texto.

como posso fazer com que o numero seja ordenado transformando em numeros e nao em texto.

Agradeço antecipadamente qualquer ajuda.


Salupe

Salupe

Curtidas 0

Respostas

Rjun

Rjun

06/04/2005

Não tem alguma função que converta o texto em numero, tipo Cast do SQL Server ?


GOSTEI 0
Salupe

Salupe

06/04/2005

tentei assim: order cast(numeros)
e tambem sem os parenteses mas nao funcionou, nao sei se nao tem essa opção ou eu errei a sintaxe.

Como o cast é utilizado no sql server, ou algum tem alguma outra idéia de como fazer essa ordenação.

Agradeço antecipadamente qualquer ajuda.


GOSTEI 0
Rjun

Rjun

06/04/2005

No SQL Server eu usaria :

Select *
From
Orcamento
where
CodTipoDocumento = ´9´
Order By
Cast(Numero as numeric)


GOSTEI 0
Salupe

Salupe

06/04/2005

desculpe esqueci de comentar, nesse comando tem como retirar os espaços em branco da variável numero.

a variável tem tamanho para 10 espaços e o numero vai ser cadastrado com 30, 50, 65 e por aí vai.

o comando aparentemente vai funcionar só que tenho que retirar os espaços em branco do campo.

Tentei utilizar
´´´+Trim(numero)+´´´
´´´+IntToStr(numero)+´´´

mas nenhum funcionou

Agradeço antecipadamente qualquer ajuda.


GOSTEI 0
Rjun

Rjun

06/04/2005

No SQL Server tem as funções RTRIM e LTRIM. Agora no Firebird não sei.


GOSTEI 0
Gandalf.nho

Gandalf.nho

06/04/2005

Vc usa CHAR ou VARCHAR nesse campo?


GOSTEI 0
Raserafim

Raserafim

06/04/2005

salupe, para ordenar basta converter a coluna para numeric, por exemplo, utilizando a função cast:

selec cast(CAMPO as numeric)
from TABELA
order by 1


o detalhe está na cláusula order by, vc tem q passar o índice da coluna que vc quer ordenar. a diferença deste índice para o delphi é que aqui o índice da 1º coluna é 1.


GOSTEI 0
Salupe

Salupe

06/04/2005

Gandalf.nho

Utilizo Char com tamanho 10

Raserafin

Sua indicação nao abre a query por ser diferente o tipo do campo

Agradeço as ajudas mas até agora nao consegui

Alguem tem mais alguma idéia

Agradeço antecipadamente qualquer nova ajuda


GOSTEI 0
Gandalf.nho

Gandalf.nho

06/04/2005

Vc estava falando em tirar os espaços em branco, isso ocorre justamente pq o campo é CHAR e não VARCHAR


GOSTEI 0
Salupe

Salupe

06/04/2005

Entao eu nao vou poder fazer esta ordenação por que o campo é char?

Se eu simplesmente trocar o campo para varchar o firebird 1.5 vai aceitar a troca simples de tipo? Fazendo a troca a ordenação será feita corretamente?

Agradeço antecipadamente qualquer ajuda.


GOSTEI 0
Gandalf.nho

Gandalf.nho

06/04/2005

Entao eu nao vou poder fazer esta ordenação por que o campo é char? Se eu simplesmente trocar o campo para varchar o firebird 1.5 vai aceitar a troca simples de tipo? Fazendo a troca a ordenação será feita corretamente? Agradeço antecipadamente qualquer ajuda.


Não custa experimentar, outro problema pode ser o fato, de como vc disse, do campo conter símbolos não numéricos. De qualquer maneira, como o conteúdo do campo geralmente é menor do que o tamanho dele, é recomendado usar VARCHAR e não CHAR


GOSTEI 0
Salupe

Salupe

06/04/2005

consegui fazer a mudança para varchar sem perder os dados que já estavam contidos, mas para o que eu preciso nao adiantou em nada e ele continua com os espaços, sem dizer que tive que atualizar todos os campos que estavam ligados à tabela (manualmente).

O negócio teria que ser mesmo conseguir retirar os espaços em branco pelo sql para poder fazer a conversão e ordenação.

Agradeço antecipadamente qualquer ajuda.


GOSTEI 0
Gandalf.nho

Gandalf.nho

06/04/2005

Não tenho certeza, mas acho que a biblioteca UDF que acompanha o IB/FB tem uma função TRIM, experimente usá-la.


GOSTEI 0
Raserafim

Raserafim

06/04/2005

salupe, caso o código que eu sugeri tenha ordenado corretamente e apenas no delphi não tenha funcionado por causa do erro do campo. vc pode fazer o seguinte:
selec cast(CAMPO as numeric), CAMPO 
from TABELA 
order by 1

assim vc ordena no código pelo campo cast mas no delphi utiliza o outro campo (duplicado) CAMPO.

e em relação ao Char e Varchar, mesmo convertendo para varchar vc realmente vai continuar com os espaçoes em branco, pois no Char ele sempre completa os caracteres restantes com espaçoes em branco (que tb é caracter) e consequentemente o varchar vai assumir estes caracteres.
se vc testar apenas em um registro cadastrar novamente, verá q vai ficar sem os espaços.


GOSTEI 0
Joatan Lima

Joatan Lima

06/04/2005

salupe, caso o código que eu sugeri tenha ordenado corretamente e apenas no delphi não tenha funcionado por causa do erro do campo. vc pode fazer o seguinte:
selec cast(CAMPO as numeric), CAMPO 
from TABELA 
order by 1

assim vc ordena no código pelo campo cast mas no delphi utiliza o outro campo (duplicado) CAMPO.

e em relação ao Char e Varchar, mesmo convertendo para varchar vc realmente vai continuar com os espaçoes em branco, pois no Char ele sempre completa os caracteres restantes com espaçoes em branco (que tb é caracter) e consequentemente o varchar vai assumir estes caracteres.
se vc testar apenas em um registro cadastrar novamente, verá q vai ficar sem os espaços.



Se o CAMPO for em branco (null) dará erro, como resolver nesse caso no select acima?
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

06/04/2005


Se o CAMPO for em branco (null) dará erro, como resolver nesse caso no select acima?


select *
from Orcamento
where
  CodTipoDocumento = '''+'9'+'''
order by cast('0'+trim(Numero) as numeric(10))

GOSTEI 0
Emerson Nascimento

Emerson Nascimento

06/04/2005

use a função COALESCE() para tratar o valor nulo.
select
   *
from
   Orcamento
where
   CodTipoDocumento = '9'
order by
   cast('0'+trim( COALESCE(Numero,'') ) as numeric(10))

você pode optar por determinar um "tamanho" e adequar a string a esse tamanho, mantendo o tipo caracter.
select
   *
from
   Orcamento
where
   CodTipoDocumento = '9'
order by
   right(replicate('0',15)+trim( COALESCE(Numero,'') ),15)


GOSTEI 0
POSTAR