Order By muda em diferentes NLS_LANG
06/09/2007
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)
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, mesmo se o NLS_LANG for diferente ?
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:
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:
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:
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
Se tiver outras maneiraas, fique a vontade de postá-las aqui!
Tags: Curiosidade, Order By
