[Dica] Order By em diferentes NLS_LANG

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:

Sabemos que mudando o NLS_LANG do oracle, ele assume comportamentos diferentes. (Por exemplo, muda o formato da Data, muda o Ponto Decimal ou Vírgula Decimal, etc.) Mas uma coisa que as vezes passa despercebido é que o NLS_LANG também pode mudar a ORDEM das colunas:

Exemplo: (Note a diferença)

Selecionar tudo

SQL> SELECT * FROM A ORDER BY 1;

F
-
1
5
A
B
C

SQL> ALTER SESSION SET NLS_LANGUAGE = 'PORTUGUESE';

Session altered.

SQL> SELECT * FROM A ORDER BY 1;

F
-
A
B
C
1
5
Como se pode ver, mudei de AMERICAN para PORTUGUESE e a ordem mudou! No primeiro caso, os números vieram primeiro. No segundo, os números ficaram por último. Como podemos nos certificar que uma coluna SEMPRE vai obedecer a mesma ordem ?

Solução 1

Pode se criar uma pequena função que indica se o campo é numérico ou não. Daí, ordenamos primeiro pelo resultado dessa função. Lá vai:

Selecionar tudo

SQL> create or replace Function f_nro ( p_numero in varchar2 ) return number
  2  as
  3    l_numero number;
  4  begin
  5    l_numero := to_number(p_numero);
  6    return 1;
  7  exception when others then return 0;
  8  end;
  9  
 10  
 11  /

Function created.

SQL> select f_nro('1234') from dual;

F_NRO('1234')
-------------
              1


SQL> select f_nro('1234a') from dual;

F_NRO('1234A')
--------------
             0

SQL> 
Veja... ela retorna ZERO se não é um número! Daí podemos ordenar desta forma:

Selecionar tudo

SQL> ALTER SESSION SET NLS_LANGUAGE = 'PORTUGUESE';

Session altered.

SQL>  SELECT * FROM A ORDER BY 1;

F
-
A
B
C
1
5

SQL> SELECT * FROM A ORDER BY f_nro(FIELD) desc, field;

F
-
5
1
A
B
C

SQL> 
Voalá!!!


Solução 2
É possível usar a função DUMP. Exemplo:

Selecionar tudo

SQL> select dump('A') from dual;

DUMP('A')
----------------
Typ=96 Len=1: 65

SQL> SELECT * FROM A ORDER BY dump(FIELD);

F
-
1
5
A
B
C
Boa sorte! Se tiver outras maneiraas, fique a vontade de postá-las aqui!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes