Array
(
)

Order by campo varchar

Joce
   - 20 mar 2012

Olá bom dia Pessoal
Eu tenho uma situação e não estou conceguindo resolvela vou tentar ilustra-lá para vcs
eu tenho uma tabela onde guardo registros de exemplares de publicalções exemplo:
EX.1
EX.2
EX.10
EX.12 (EX- quer dizer exemplar e não exemplo)
etc...
estou tentando ordenar por esse campo mas oq acontece é que ele ordena assim atrvés do order by N.EXEMPLAR
EX.1
EX.10
EX.12
EX.2
mas oq eu queria era ordenar na order dos exemplar desse jeito..
EX.1
EX.2
EX.10
EX.12
será que isso é possivel ....des de já agradeço.
Att:Joce

Joel Rodrigues
   - 20 mar 2012

Quando um campo é do tipo texto, sua ordenação se dá pela ordem alfabética.
Eu imagino duas soluções (para contornar a situação):
1) Você pega somente a parte do texto que representa o número do exemplar (EX.10 = 10) e ordena por essa parte, convertendo-a para inteiro.
2) Você criar um campo numérico que guarde o número do exemplar, assim poderá ordenar por ele. Para atualizar esse campo no primeiro momento, pegaria o trecho citado acima, converteria para número e jogaria no campo.

Boa sorte.

Joce
   - 20 mar 2012

Joel Rodrigues obrigado pela responsta,acho que entendi oque você quis dizer... eu tentei o seguinte

ORDER BY CAST(N.EXEMPLAR AS NUMERIC)

porem com isso ele me retorna um erro que nao pode converter texto para numero...

oque eu acho que você quis dizer é pegar somente a parte correspondente ao numero (EX.10=10)...
mas confesso que não conheço método para fazer isso.

Joce
   - 20 mar 2012

Amigo muito obrigado pela colaboração acho que resolvi o problema...
agradeço sua participação,o comando ficou assim

ORDER BY RIGHT(B.NEXEMPLAR,2)

Obrigado!!

Joel Rodrigues
   - 20 mar 2012

É, funcionou exatamente como eu tinha falado, ordenou somente pela parte numérica do texto. Eu é que tinha esquecido da função RIGHT, falha minha.
Dica: você pegou somente os dois últimos caracteres do exemplar. E se tiver o exemplar EX.100?
Ao invés do número 2 direto, use uma expressão equivalente: LEN(B.NEXEMPLAR)-3
Ou seja, pegará a quantidade de caracteres total do texto e subtrairá 3 referente à parte EX. (3 caracteres), com isso retornará apenas a diferença (o que sobra à direita).

Espero ter sido claro. Até a próxima...

Joce
   - 20 mar 2012

Nesse meu caso nao vai existir um exemplar 100...mas é uma questão a ser pensada...desculpe por minha ignorância,abusando um pouco da sua boa vontade oque vem a ser o LEN?entendi que através do LEN(B.NEXEMPLAR)-3 ele subtrairá, mas como eu sei que ele subtrairá da esquerda para a direita?ou não é assim que esse comando funciona?
obrigado novamente!

Joel Rodrigues
   - 21 mar 2012

A função LEN retorna o comprimento do string. Por exemplo, LEN(´EX.10´) retorna 5.
Como o exemplar é composto por uma parte fixa (creio eu) ´EX.´ e mais um número (10, no exemplo), podemos pegar a quantidade de dígitos do número, da direita para a esquerda, utilizando o comprimento total do exemplar menos o da parte fixa.
Ou seja:
- LEN(´EX.10´) = 5
- a parte fixa ´EX.´ contem 3 caracteres;
- o restante (que deve ser o número) deve ter 5 - 3 = 2 (o 2 que você fixou, só que agora calculado);

Assim, para qualquer exemplar, você pode usar LEN(B.NEXEMPLAR)-3 que retornará apenas o comprimento da parte numérica.
Exemplos:
EX.5 = 1
EX.10 = 2
EX.234 = 3

Beleza?