<div dir="ltr">Então apesar de ser a mesma tabela, alguns iram ter prefixo e outras não. Só que o padrão não muda. Se o cliente começar um 1 e ele vai até o fim só usando inteiros e se ele coloca uma string no início, as demais iram que ter também. Então eu fiz um select a mais buscando o primeiro valor e verifico se tem string, se tiver string faço sem cast. Mas eu vou mudar o código, porque o importante são os números, então vou criar um campo numeric e vou adicionar o número e deixo o campo codigo como esta mesmo.<div>
<br></div><div>Valeu pela dica :)</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">Em 25 de julho de 2013 07:42, Eden Cardim <span dir="ltr"><<a href="mailto:eden@insoli.de" target="_blank">eden@insoli.de</a>></span> escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">>>>>> "Lucas" == Lucas Moraes <<a href="mailto:lucastiagodemoraes@gmail.com">lucastiagodemoraes@gmail.com</a>> writes:<br>

<br>
    Lucas> Stanislaw era isso mesmo, funcionou: max(codigo::integer)<br>
<br>
Funciona… Só que não. Isso vai quebrar horrendamente se você tiver<br>
valores do tipo 'ALP-001', que você mencionou anteriormente. E se<br>
todos os valores são garantidamente numéricos, é melhor declarar logo<br>
o campo como um tipo numérico mesmo.<br>
<br>
O motivo pelo qual max(codigo) está retornando 999 é que a ordenação<br>
está sendo feita por ordem de caracteres, e nos encodings mais<br>
populares, o caracter '9' tem a maior colação dentre os caracteres<br>
"alfa-numéricos".<br>
<br>
O "correto" nesse caso é declarar um tipo, que vai ensinar ao<br>
postgresql como se ordenam esses valores (AAA-999 é "maior" ou "menor"<br>
que ZZZ-000?). Algumas alternativas improvisadas que são mais<br>
simples/fáceis porém tem algumas desvantagens:<br>
<br>
- excluir valores não-numéricos via regex: WHERE codigo ~~ '^\d+$'<br>
  que é extremamente lento e precisa de tratamento separado pros<br>
  valores que tem caracteres não-númericos.<br>
<br>
- criar um mapeamento de equivalência num segundo campo e usar esse<br>
  campo pra fazer a ordenação, invés do original. Isso depende da<br>
  garantia manual de integridade do mapeamento.<br>
<br>
- quebrar o campo codigo em dois campos, um varchar, que vai conter a<br>
  parte 'ALP', e um numérico, que vai conter a parte '001'<br>
  representada como 1. Na hora de recuperar o valor original, você<br>
  remonta o valor com:<br>
<br>
  select cod_char || '-' ||<br>
         overlay('000' placing cod_num<br>
                          from 3 - length(cod_num::string))<br>
    from tabela order by cod_num desc, cod_char limit 1;<br>
<br>
  Isso só vai funcionar se a parte numérica tiver a mesma "largura" em<br>
  caracteres na parte numérica, senão você vai precisar de um terceiro<br>
  campo pra armazenar essa informação, etc. Você pode declarar views<br>
  pra fazer as conversões automaticamente. Essa é a abordagem que eu<br>
  recomendo.<br>
<br>
Sim, é um problema mais complicado do que parece. Pode chorar e<br>
espernear a vontade, mas não há uma forma "simples" de resolver isso<br>
que não deixe pontos de falha grotescos sobrando. Como de costume:<br>
"não existe almoço gratuito".<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Eden Cardim -- Insolide Soluções de TI Ltda.<br>
<a href="tel:%2B55%2011%209%209644%208225" value="+5511996448225">+55 11 9 9644 8225</a><br>
<a href="http://insoli.de" target="_blank">http://insoli.de</a><br>
</font></span><div class="HOEnZb"><div class="h5">=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br></div>