Los datos expuestos en este blog, son solo de índole informativo. Por favor realiza siempre una copia de seguridad antes de realizar cualquier cambio en tu proyecto.
Oracle/PLSQL: ordenar el campo varchar2 como campo numérico
Problema: tengo un campo definido en Oracle como varchar2, pero contiene números. Cuando uso la cláusula “ordenar por”, los registros se ordenan en orden ascendente de caracteres. Pero quiero ordenarlo numéricamente sin cambiar el tipo de datos de varchar2 a número. ¿Hay alguna solución?
R: Para ordenar numéricamente un campo, hay dos posibles soluciones:
Solución #1
La primera solución solo funciona si el campo varchar2 contiene todos los números. Para hacer esto, debe agregar otro campo a la cláusula “ordenar por” que se evalúe como un número, pero no tiene que incluir este nuevo campo en la parte SELECCIONAR del SQL.
Por ejemplo,
Es posible que tenga una tabla de proveedores definida como:
create table supplier ( supplier_id varchar2(10) not null, supplier_name varchar2(60) );
Cuando ejecuta la siguiente declaración de selección, el campo id_proveedor se ordena alfabéticamente, incluso si contiene números.
select * from supplier order by supplier_id;
Sin embargo, puede ejecutar el siguiente SQL y devolverá los ID de proveedor ordenados numéricamente:
select * from supplier order by TO_NUMBER(supplier_id);
Este SQL convierte el campo id_proveedor en un valor numérico y luego ordena el valor en orden ascendente. Esta solución devolverá un error si no todos los valores en el campo id_proveedor son números.
Solución #2 (solución más convincente)
Nos gustaría agradecer a Camille por encontrar esta solución.
Esta solución funcionará incluso si el campo varchar2 contiene valores no numéricos.
Nuevamente, demostraremos esta solución en la tabla de proveedores, definida como:
create table supplier ( supplier_id varchar2(10) not null, supplier_name varchar2(60) );
Recuerde que nuestro objetivo es ordenar el campo id_proveedor en orden ascendente (según su valor numérico). Para esto, intente usar la función LPAD.
Por ejemplo:
select * from supplier order by LPAD(supplier_id, 10);
Este SQL rellena el frente del campo id_proveedor con espacios de hasta 10 caracteres. Sus resultados ahora deben ordenarse numéricamente en orden ascendente.
Tenga en cuenta que si tiene más de 10 dígitos en el campo id_proveedor, es posible que deba aumentar el segundo parámetro de la función LPAD.
Obtenga más información sobre las capacidades de LPAD.