Ok, tengo una tabla con una clave indexada y un campo no indexado. Necesito encontrar todos los registros con un cierto valor y devolver la fila. Me gustaría saber si puedo ordenar por múltiples valores.
Ejemplo:
id x_field
-- -----
123 a
124 a
125 a
126 b
127 f
128 b
129 a
130 x
131 x
132 b
133 p
134 p
135 i
pseudo: quisiera que los resultados se ordenen así, where ORDER BY x_field = 'f', 'p', 'i', 'a'
SELECT *
FROM table
WHERE id NOT IN (126)
ORDER BY x_field 'f', 'p', 'i', 'a'
Entonces los resultados serían:
id x_field
-- -----
127 f
133 p
134 p
135 i
123 a
124 a
125 a
129 a
La sintaxis es válida pero cuando ejecuto la consulta nunca devuelve ningún resultado, incluso si la limito a 1 registro. ¿Hay otra forma de hacer esto?
Piense en el x_field como resultados de la prueba y necesito validar todos los registros que caen en la condición. Quería ordenar los resultados de la prueba por valores fallidos, valores pasados. Entonces podría validar los valores fallidos primero y luego los valores pasados usando ORDER BY.
Lo que no puedo hacer:
- GROUP BY, ya que necesito devolver los valores de registro específicos
- DONDE x_field IN ('f', 'p', 'i', 'a'), necesito todos los valores ya que estoy tratando de usar una consulta para varias pruebas de validación. Y los valores de x_field no están en orden DESC / ASC
Después de escribir esta pregunta, estoy empezando a pensar que necesito repensar esto, ¡LOL!
fuente
Respuestas:
fuente
Puedes usar LEFT JOIN con "VALUES ('f', 1), ('p', 2), ('a', 3), ('i', 4)" y usar la segunda columna en tu orden -por expresión. Postgres usará un Hash Join, que será mucho más rápido que un CASE enorme si tiene muchos valores. Y es más fácil de autogenerar.
Si esta información de pedido es fija, entonces debería tener su propia tabla.
fuente
Tratar:
Estaba en el camino correcto, pero al poner x_field solo en el valor F, los otros 3 se trataron como constantes y no se compararon con nada en el conjunto de datos.
fuente
Use un
case
interruptor para traducir los códigos en números que se pueden ordenar:fuente
Encontré una solución mucho más limpia para esto:
Nota: array_position necesita Postgres v9.5 o superior.
fuente
array_position(ARRAY[1, 0]::integer[], x_field)
El
CASE
yORDER BY
sugerencias debería funcionar, pero voy a sugerir un caballo de un color diferente. Suponiendo que solo hay un número razonable de valores parax_field
y ya sabe cuáles son, cree un tipo enumerado con F, P, A e I como valores (más cualquier otro valor posible que se aplique). Las enumeraciones se ordenarán en el orden implícito en suCREATE
declaración. Además, puede utilizar nombres de valores significativos (probablemente su aplicación real lo haga y los ha enmascarado por motivos de confidencialidad) sin desperdiciar espacio, ya que solo se almacena la posición ordinal.fuente
Puede ordenar por una columna seleccionada u otras expresiones.
Aquí un ejemplo, cómo ordenar por el resultado de una declaración de caso:
El resultado será una lista que comienza con las filas "IsGen = 0", seguidas de las filas "IsGen = 1" y todas las demás filas al final.
Puede agregar más parámetros de pedido al final:
fuente
Para alguien que es nuevo en ORDER BY con CASE, esto puede ser útil
fuente
puede usar la posición (texto en texto) en orden para ordenar la secuencia
fuente