2008-12-29 15 views
12

Tengo una consulta SQL (utilizando Firebird como RDBMS) en la que necesito ordenar los resultados por un campo, EDICIÓN. Sin embargo, necesito ordenar por el contenido del campo. es decir, "NE" va primero, "OE" va en segundo lugar, "OP" ocupa el tercer lugar, y los espacios en blanco van al último. Lamentablemente, no tengo ni idea de cómo se podría lograr esto. Todo lo que hice fue ORDENAR POR [CAMPO] ASC/DESC y nada más.Solicitud de consulta SQL por valores de campo específicos

¿Alguna sugerencia?

Editar: Realmente debería aclarar: solo esperaba aprender más aquí. Lo tengo ahora que tengo múltiples declaraciones de selección que definen qué mostrar primero. La consulta es bastante grande y yo estaba realmente esperando para aprender, posiblemente, de una manera más eficiente de hacer esto: ejemplo:

SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='NE' 
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OE' 
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OP' 
UNION (etc...) 
+0

N una de las soluciones sugeridas requiere los múltiples selects/unions. Todos deberían ser mucho más rápidos y fáciles de mantener, y la consulta será MUCHO más fácil de leer. –

+0

Voy con Peter LaComb en este caso. ¿Por qué estás usando UNIONs? No es necesario Iría con SELECT * DE Venta minorista DONDE MITUTO ME GUSTA 'somethi%' Y EDICIÓN EN ('NE', 'OE', 'OP', '') PEDIDO POR EDICIÓN DE CASO Cuando 'NE' Luego 1 Cuando 'OE' Entonces 2 Cuando 'OP' Luego 3 Else 4 Fin – Pulsehead

+0

@Pulsehead puede encontrar la respuesta a por qué habría utilizado los sindicatos en algún lugar de esta misma pregunta de StackOverflow sobre no saber la mejor manera de ordenar campos. – Cyprus106

Respuesta

40
Order By Case Edition 
    When 'NE' Then 1 
    When 'OE' Then 2 
    When 'OP' Then 3 
    Else 4 End 
+0

OOH! Más simplificado que cómo lo hago. Tendré que recordar tu solución. – Pulsehead

+0

De hecho, no había visto esa sintaxis antes. –

+0

La caja es una cosa maravillosa –

5

Añadir esos valores a otra tabla con una columna numérica de su rango:

Edition Rank 
NE  1 
OE  2 
OP  3 

Únase a las tablas y ordene en el campo RANGO.

+0

Exactamente. Si no es una necesidad permanente o cambia con frecuencia, entonces el OP puede usar una variable tabla/tabla variable. – StingyJack

5
SELECT 
    /*other fields*/ 
    CASE WHEN 'NE' THEN 1 
    WHEN "OE" THEN 2 
    WHEN "OP" THEN 3 
    ELSE 4 
END AS OrderBy 
FROM 
    /*Tables*/ 
WHERE 
    /*conditions*/ 
ORDER BY 
    OrderBy, 
    /*other fields*/ 
+0

Pásame al golpe, +1. –

+0

Gracias. Me alegra saber que otros usan este hack/kludge! me hace sentir como un mejor programador/dba. – Pulsehead

+0

En el momento en que comencé el pedido por SO me advirtió de 3 respuestas. –

2

Probar:

select * 
from MyTable 
order by 
case [FIELD] 
    when 'NE' then 1 
    when 'OE' then 2 
    when 'OP' then 3 
    when '' then 4 
    else 5 
end 
0

Prueba esto:

ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,') 
+0

FIND_IN_SET() no funciona en SQL Server 2005. ¿Puede decirme cómo lo hizo? Tengo una solución de kludge, pero siempre estoy buscando una solución más elegante. – Pulsehead

+0

CHARINDEX() funcionaría. – recursive

0
CREATE TABLE #TMP 
(
     ID INT IDENTITY(1,1), 
     NAME VARCHAR(100), 
) 

INSERT INTO #TMP 
SELECT 'ASHISH' 
UNION ALL 
SELECT 'CHANDAN' 
UNION ALL 
SELECT 'DILIP' 
UNION ALL 
SELECT 'ESHA' 
UNION ALL 
SELECT 'FIZA' 
UNION ALL 
SELECT 'MAHESH' 
UNION ALL 
SELECT 'VIPUL' 
UNION ALL 
SELECT 'ANIL' 

-- I want to sort NAME column from value 'DILIP' then query will be as bellow 

SELECT * FROM #TMP ORDER BY CASE WHEN NAME='DILIP' THEN '1' ELSE NAME END ASC 

DROP TABLE #TMP 

Para más detalle click here

Cuestiones relacionadas