sql - los - introduccion a la filogenia
PostgreSQL ORDER BY tema-clasificación natural (4)
La razón es que la cadena se ordena alfabéticamente (en lugar de numéricamente como la quieres) y 1 ordena antes de 9. Puedes resolverlo así:
SELECT * FROM employees ORDER BY substring(em_code, 3)::int DESC
Sería más eficiente eliminar el ''EM'' redundante de tu em_code
, si puedes, y guardar un número entero para empezar.
Respuesta adicional a la pregunta en el comentario
Para quitar cualquiera y todos los no dígitos de una cadena:
SELECT regexp_replace(em_code, E''//D'','''',''g'')
FROM employees
/D
es la expresión regular clase-taquigrafía para "sin dígitos".
''g''
como 4 ° parámetro es el interruptor "global" para aplicar el reemplazo a cada aparición en la cadena, no solo a la primera.
Así que reemplazo cada no dígito con la cadena vacía destilando únicamente dígitos de la cadena.
Tengo un problema de ORDER BY
Postgres con la siguiente tabla:
em_code name
EM001 AAA
EM999 BBB
EM1000 CCC
Para insertar un nuevo registro en la tabla,
- Selecciono el último registro con
SELECT * FROM employees ORDER BY em_code DESC
- Franja de alfabetos de em_code usiging reg exp y store en
ec_alpha
- Emitir la parte restante a entero
ec_num
- Incrementar en un
ec_num++
- Pad con suficientes zeors y prefijo
ec_alpha
otra vez
Cuando em_code
alcanza EM1000, el algoritmo anterior falla.
El primer paso devolverá EM999 en lugar de EM1000 y nuevamente generará EM1000 como nuevo em_code
, rompiendo la restricción de clave única.
¿Alguna idea de cómo seleccionar EM1000?
puede usar solo esta línea "ORDEN POR longitud (subcadena (em_code FROM ''[0-9] +'')), em_code"
Esto siempre surge en preguntas y en mi propio desarrollo, y finalmente me cansé de formas complicadas de hacer esto. Finalmente me rompí y lo implementé como una extensión de PostgreSQL:
https://github.com/Bjond/pg_natural_sort_order
Es gratis, licencia de MIT.
Básicamente solo normaliza los valores numéricos (cero valores numéricos pendientes) dentro de las cadenas, de modo que puede crear una columna de índice para la clasificación a alta velocidad au naturel. El léame explica.
La ventaja es que puede hacer que un disparador haga el trabajo y no el código de su aplicación. Se calculará a velocidad de máquina en el servidor de PostgreSQL y las migraciones de columnas de adición se vuelven simples y rápidas.
Escribí sobre esto en detalle en esta pregunta relacionada:
Clasificación numérica humanizada o natural de cadenas mixtas de palabras y números
(Estoy publicando esta respuesta como una referencia cruzada útil solamente, por lo que es wiki de la comunidad).