resueltos ejercicios ejemplos datos consultas complejas sql oracle select sql-order-by where-clause

ejercicios - order by sql server ejemplos



¿Cómo mostrar los registros de una tabla ordenada como en la cláusula where? (4)

Estoy tratando de mostrar los registros, ordene como en la cláusula where ... ejemplo:

select name from table where name in (''Yaksha'',''Arun'',''Naveen'');

Muestra Arun,Naveen,Yaksha (alphabetical order)
Quiero mostrarlo en el mismo orden, ie ''Yaksha''''Arun'',''Naveen''
cómo mostrar esto ... Estoy usando oracle db.


Agregue este ORDER BY al final de la consulta:

order by case name when ''Yaksha'' then 1 when ''Arun'' then 2 when ''Naveen'' then 3 end

(No hay otra forma de obtener ese pedido. Necesita un ORDER BY para obtener un orden de resultado específico).


Puede ser un poco torpe, pero puede crear un pedido personalizado con una expresión de case :

SELECT * FROM my_table WHERE name IN (''Yaksha'', ''Arun'',''Naveen'') ORDER BY CASE name WHEN ''Yaksha'' THEN 1 WHEN ''Arun'' THEN 2 WHEN ''Naveen'' THEN 3 END ASC

Una opción un poco más larga, pero una que evita la duplicación de los literales de cadena es usar una subconsulta:

SELECT m.* FROM my_table m JOIN (SELECT ''Yaksha'' AS name, 1 AS name_order FROM dual UNION ALL SELECT ''Arun'' AS name, 2 AS name_order FROM dual UNION ALL SELECT ''Naveen'' AS name, 3 AS name_order FROM dual) o ON o.name = m.name ORDER BY o.name_order ASC


Puedes probar con algo como lo siguiente:

SELECT * FROM test WHERE name IN ( ''Yaksha'', ''Arun'', ''Naveen'' ) ORDER BY instr ( q''[''Yaksha'', ''Arun'', ''Naveen'']'', name ) ASC

De esta manera podría ser útil si su lista IN es de alguna manera dinámica.


Si la lista de valores es dinámica o simplemente no desea repetir los valores, puede usar (o abusar, según su punto de vista) una colección de tablas y unir su tabla real a una expresión de colección de tablas en lugar de usar IN :

select your_table.name from table(sys.odcivarchar2list(''Yaksha'',''Arun'',''Naveen'')) t join your_table on your_table.name = t.column_value;

Lo cual generalmente funcionará, pero, por supuesto, sin una cláusula de orden por pedido no se garantiza que funcione, por lo que puede usar una vista en línea para asignar el orden:

select your_table.name from ( select row_number() over (order by null) as rn, column_value as name from table(sys.odcivarchar2list(''Yaksha'',''Arun'',''Naveen'')) ) t join your_table on your_table.name = t.name order by t.rn;

Esto aún se basa en row_number() over (order by null) usando el orden de los elementos en la colección; que se basa en la eliminación de una colección preservando el orden de los elementos. Tampoco creo que eso esté garantizado, por lo que todavía hay un riesgo involucrado.