2012-03-20 18 views

Respuesta

35

Uso lower(field), por ejemplo,

select * from tbl order by lower(name) 

Si usted necesita para hacer frente caracteres especiales para idiomas distintos del inglés y luego las otras respuestas sobre NLSSORT pueden ser lo que necesita. Si no lo hace, trataría de usar KISS y usar lower(), ya que es muy fácil de recordar y usar y que otros lo lean (mantenibilidad).

+1

Una cosa a añadir sería que esto significaría que si no hay un índice funcional en 'inferior (nombre)' un escaneo completo de tabla se haría con esta consulta. – beny23

+6

Esta consulta siempre requerirá un escaneo de tabla completo, con o sin un ORDER BY. Por lo general, el problema que describes es más importante con la cláusula WHERE. – DCookie

+3

@DCookie: ¿quieres apostar? ;) p.ej. intente un índice funcional en 'lower (name)' agregado con todas las columnas de la tabla = análisis de índice completo, más no sort :) - solo diciendo ' –

7

Si utiliza versiones relativamente recientes de Oracle, debe ver configurar NLS_SORT/NLS_COMP, en lugar de usar la función LOWER().

Si no desea afectar globalmente la instancia, puede usar la función NLSSORT() para establecer NLS_SORT para el alcance de una consulta específica.

SQL> create table case_insensitive(a varchar2(10)); 

Table created. 

SQL> insert into case_insensitive values('D'); 

1 row created. 

SQL> 
SQL> 
SQL> c/'D/'c 
    1* insert into case_insensitive values('c') 
SQL>/

1 row created. 

SQL> c/'c/'B 
    1* insert into case_insensitive values('B') 
SQL>/

1 row created. 

SQL> c/'B/'a 
    1* insert into case_insensitive values('a') 
SQL>/

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select * from case_insensitive; 

A 
---------- 
D 
c 
B 
a 

SQL> select * from case_insensitive order by a; 

A 
---------- 
B 
D 
a 
c 

SQL> select * from case_insensitive order by nlssort(a,'NLS_SORT=BINARY_CI'); 

A 
---------- 
a 
B 
c 
D 

Un buen ejemplo de esto se puede encontrar here.

+0

La configuración de NLS_SORT/NLS_COMP cambiará el comportamiento de todas las consultas. Lo cual es genial si eso es lo que uno quiere. No tan bueno si no lo es. –

+0

No necesariamente. Volveré y editaré mi ejemplo para demostrar. –

+0

NLSSORT y NLS_SORT están definidos por Oracle pero son cosas diferentes. La parte superior de esta respuesta hace referencia a NLS_SORT, un parámetro. Sin embargo, el código agregado después de que comencé utiliza la función NLSSORT. Entonces, si originalmente se refería a NLSSORT, tiene razón en que mi comentario no se aplicaría. NLSSORT http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions113.htm#SQLRF00678, NLS_SORT http://docs.oracle.com/cd/E11882_01/server.112/e25513/initparams152. htm # REFRN10127 –

12

Otra opción es el uso de la función NLSSORT para realizar linguistic sorting:

SQL> with test as (select 'ANNIE' as col from dual 
    2  union all select 'BOB' from dual 
    3  union all select 'Daniel' from dual 
    4  union all select 'annie' from dual 
    5  union all select 'bob' from dual 
    6  union all select 'Ångström' from dual 
    7  union all select 'ångström' from dual) 
    8 select col 
    9 from test 
10 order by nlssort(col, 'NLS_SORT = WEST_EUROPEAN') 
11/

COL 
---------- 
Ångström 
ångström 
ANNIE 
annie 
BOB 
bob 
Daniel 

Las ventajas son una mayor flexibilidad. Uno puede ordenar los personajes con acentos y diferentes casos juntos. Uno puede elegir tratar a algunos personajes de un modo específico por idioma al specifying different values for NLS_SORT. Define un orden dentro del conjunto de caracteres equivalentes. Entonces 'A' y 'a' se ordenan juntos, pero dentro de 'a's, la mayúscula es lo primero. Desventajas Espero que NLSSORT use más CPU que LOWER, aunque no lo he marcado en banco. Y NLSSORT sólo utilizará un prefijo de longer strings:

la cadena devuelta, también conocida como la clave de clasificación, es decir los datos RAW tipo. La longitud de la clave de intercalación resultante de un valor de char dado para una intercalación dada puede exceder 2000 bytes, que es la longitud máxima del valor SIN PROCESAR devuelto por NLSSORT. En este caso, NLSSORT calcula la clave de intercalación para un prefijo máximo, o subcadena inicial , de char para que el resultado calculado no exceda de 2000 bytes. Para las intercalaciones monolingües, por ejemplo, FRANCÉS, el prefijo tiene una longitud de 1000 caracteres. Para intercalaciones multilingües, para el ejemplo GENERIC_M, el prefijo normalmente tiene 500 caracteres. La longitud exacta de puede ser más baja o más alta según la intercalación y los caracteres que figuran en el carácter.

+0

Consulte http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch5lingsort.htm#i1006421 para obtener información sobre el uso de índices con clasificación lingüística. –

+1

+1 buena ilustración. – DCookie

-1

Puede utilizar la Orden por cluse para este

select col_name from table_name 
order by col_name ; 
0

Se puede utilizar por ejemplo INITCAP

SELECT fld FROM tbl ORDER BY INITCAP(fld) ASC; 
+1

No hay razón para proporcionar una respuesta que no sea mejor que una aceptada. Además, initcap no funcionará (considere 'ANNA' y 'annie'). –

Cuestiones relacionadas