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.