ordenar por texto como numero via sql
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.
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
Curtidas 0
Respostas
Rjun
06/04/2005
Não tem alguma função que converta o texto em numero, tipo Cast do SQL Server ?
GOSTEI 0
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.
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
06/04/2005
No SQL Server eu usaria :
Select *
From
Orcamento
where
CodTipoDocumento = ´9´
Order By
Cast(Numero as numeric)
Select *
From
Orcamento
where
CodTipoDocumento = ´9´
Order By
Cast(Numero as numeric)
GOSTEI 0
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.
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
06/04/2005
No SQL Server tem as funções RTRIM e LTRIM. Agora no Firebird não sei.
GOSTEI 0
Gandalf.nho
06/04/2005
Vc usa CHAR ou VARCHAR nesse campo?
GOSTEI 0
Raserafim
06/04/2005
salupe, para ordenar basta converter a coluna para numeric, por exemplo, utilizando a função cast:
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.
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
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
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
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
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.
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
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
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.
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
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
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:
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.
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
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:
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.
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
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
06/04/2005
use a função COALESCE() para tratar o valor nulo.
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 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