una - sql ¿PEDIDO POR valores múltiples en orden específico?
retornar valor stored procedure sql server (6)
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 lo limito a 1 registro. ¿Hay alguna otra manera de hacerlo?
Piense en x_field como resultados de 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. Así que pude 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 tengo que volver a pensar esto, ¡ja ja!
Las sugerencias CASE
y ORDER BY
deberían funcionar, pero voy a sugerir un caballo de un color diferente. Suponiendo que solo hay un número razonable de valores para x_field
y ya sabe cuáles son, cree un tipo enumerado con F, P, A e I como valores (más cualquier otro posible valor aplicable). Los enum ordenarán en el orden implícito en su declaración CREATE
. Además, puede usar nombres de valor poco prometedores, probablemente su aplicación real sí y acaba de enmascararlos por confidencialidad, sin perder espacio, ya que solo se almacena la posición ordinal.
Puedes usar un LEFT JOIN con un "VALUES (''f'', 1), (''p'', 2), (''a'', 3), (''i'', 4)" y usar la segunda columna en tu orden por expresión. Postgres usará una Hash Join que será mucho más rápida que una gran CASE si tiene muchos valores. Y es más fácil de autogenerar.
Si esta información de ordenamiento es fija, entonces debería tener su propia tabla.
Tratar:
ORDER BY x_field=''F'', x_field=''P'', x_field=''A'', x_field=''I''
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.
Use un interruptor de case
para traducir los códigos en números que puedan ordenarse:
ORDER BY
case x_field
when ''f'' then 1
when ''p'' then 2
when ''i'' then 3
when ''a'' then 4
else 5
end
puede usar la posición (texto en texto) en orden para ordenar la secuencia
...
WHERE
x_field IN (''f'', ''p'', ''i'', ''a'') ...
ORDER BY
CASE x_field
WHEN ''f'' THEN 1
WHEN ''p'' THEN 2
WHEN ''i'' THEN 3
WHEN ''a'' THEN 4
ELSE 5 --needed only is no IN clause above. eg when = ''b''
END, id