tabla registros query queries ordenar orden generating from descendente crear sql sql-server tsql sql-server-2000 sql-order-by

registros - TSQL-¿Es posible definir el orden de clasificación?



order by sql server (7)

¿Es posible definir un orden de clasificación para los resultados devueltos?

Me gustaría que el orden de clasificación fuera ''naranja'' ''manzana'' ''fresa'' no ascendente o descendente.

Sé que ORDER BY puede hacer ASC o DESC, pero ¿existe una cosa de tipo DEFINIDO (''naranja'', ''manzana'', ''fresa'')?

Esto se ejecutará en SQL Server 2000.


Agregue una clave a la tabla (por ejemplo, fruit_id int identity (1,1) clave principal) para conservar el orden de inserción

create table fruit(fruit_id int identity(1,1) primary key, name varchar(50)) go insert into fruit(name) values (''orange'') insert into fruit(name) values (''apple'') insert into fruit(name) values (''strawberry'') select name from fruit

resultado:

orange apple strawberry


Es increíblemente torpe, pero puede usar una declaración CASE para ordenar:

SELECT * FROM Blah ORDER BY CASE MyColumn WHEN ''orange'' THEN 1 WHEN ''apple'' THEN 2 WHEN ''strawberry'' THEN 3 END

Alternativamente, puede crear una tabla secundaria que contenga el campo de clasificación y un orden de clasificación.

TargetValue SortOrder orange 1 apple 2 strawberry 3

Y únete a tu mesa en esta nueva mesa.


Lo que hago en ese caso es

ORDER BY CASE WHEN FRUIT = ''Orange'' THEN ''A'' WHEN FRUIT = ''Apple'' THEN ''B'' WHEN FRUIT = ''Strawberry'' THEN ''C'' ELSE FRUIT END


No es tan común, pero para operaciones de valor único o patrones específicos, REEMPLAZAR funciona también

p.ej.

DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50)); INSERT INTO @Fruit (Name) VALUES (''Orange''); INSERT INTO @Fruit (Name) VALUES (''Apple''); INSERT INTO @Fruit (Name) VALUES (''Strawberry''); INSERT INTO @Fruit (Name) VALUES (''__Pear''); SELECT * FROM @Fruit AS f ORDER BY REPLACE(f.Name,''__'','''') Fruit_Id Name ----------- -------------------------------------------------- 2 Apple 1 Orange 4 __Pear 3 Strawberry


Si esto va a ser un requisito de corta duración, use una declaración de caso. Sin embargo, si piensa que puede durar un tiempo, y siempre será orden de orange/apple/strawberry (o incluso si no, vea más abajo), puede pensar en sacrificar algo de espacio en disco para ganar algo de velocidad.

Cree una nueva columna en su tabla llamada or_ap_st y use un activador de inserción / actualización para completarla con el número 1, 2 o 3, dependiendo del valor de su columna de fruta. Entonces indícalo en ello.

Dado que la única vez que los datos en esa columna cambiarán es cuando la fila cambie, ese es el mejor momento para hacerlo. El costo se incurrirá en un pequeño número de escrituras en lugar de un gran número de lecturas, por lo tanto, se amortiza en las declaraciones select .

Su consulta será entonces increíblemente rápida:

select field1, field2 from table1 order by or_ap_st;

sin funciones por fila matando el rendimiento.

Y, si también quieres otros órdenes de clasificación, es por eso que llamé a la columna or_ap_st . Puedes agregar tantas otras columnas de clasificación como necesites.


Utilice una sentencia CASE :

ORDER BY CASE your_col WHEN ''orange'' THEN 1 WHEN ''apple'' THEN 2 WHEN ''strawberry'' THEN 3 END

Sintaxis alternativa, con un ELSE:

ORDER BY CASE WHEN your_col = ''orange'' THEN 1 WHEN your_col = ''apple'' THEN 2 WHEN your_col = ''strawberry'' THEN 3 ELSE 4 END


Yendo más allá de la respuesta de turtlepick :

ORDER BY CASE WHEN FRUIT = ''Orange'' THEN ''A'' WHEN FRUIT = ''Apple'' THEN ''B'' WHEN FRUIT = ''Strawberry'' THEN ''C'' ELSE FRUIT END

En caso de que tenga más elementos en FRUTA y comiencen con letras definidas después de las palabras clave THEN, esos elementos aparecerán dentro del orden codificado. Por ejemplo Banana aparece antes de la fresa. Se puede sortear con

ORDER BY CASE WHEN FRUIT = ''Orange'' THEN ''.1'' WHEN FRUIT = ''Apple'' THEN ''.2'' WHEN FRUIT = ''Strawberry'' THEN ''.3'' ELSE FRUIT END

Aquí he usado caracteres con valores ASCII más bajos con la esperanza de que no aparezcan al comienzo de los valores en FRUIT.