2010-09-11 10 views
8

En Python, puedo escribir una función de comparación que devuelve un producto en el conjunto {-1, 0, 1} y pasarlo a una función de clasificación de este modo:¿Puede usar una función de comparación personalizada de Postgres para las cláusulas ORDER BY?

sorted(["some","data","with","a","nonconventional","sort"], custom_function) 

Este código ordenar la secuencia de acuerdo con el orden de clasificación defino en la función.

¿Puedo hacer el equivalente en Postgres?

p. Ej.

SELECT widget FROM items ORDER BY custom_function(widget) 

Editar: ejemplos y/o enlaces a documentación son bienvenidos.

Respuesta

10

Sí puede, incluso puede crear un índice funcional para acelerar la clasificación.

Editar: Un simple ejemplo:

CREATE TABLE foo(
    id serial primary key, 
    bar int 
); 
-- create some data 
INSERT INTO foo(bar) SELECT i FROM generate_series(50,70) i; 
-- show the result 
SELECT * FROM foo; 

CREATE OR REPLACE FUNCTION my_sort(int) RETURNS int 
LANGUAGE sql 
AS 
$$ 
    SELECT $1 % 5; -- get the modulo (remainder) 
$$; 
-- lets sort! 
SELECT *, my_sort(bar) FROM foo ORDER BY my_sort(bar) ASC; 

-- make an index as well: 
CREATE INDEX idx_my_sort ON foo ((my_sort(bar))); 

El manual está llena de ejemplos de cómo utilizar sus propias funciones, acaba de empezar a jugar con él.

+0

lo pensé, lo siento por el lugar "obvia" pregunta, pero ... ¿cómo diablos hago esto? La documentación y Google no parecen darme una respuesta obvia. Algunos más detalles/ejemplos serían muy apreciados. ¡Gracias! –

+0

Verifica el ejemplo simple. Ahora depende de usted y su imaginación :-) –

+1

Gracias por el ejemplo adicional. Sin embargo, su función solo toma una variable. En Python, la función de ordenamiento toma dos variables. Si la variable 1 debe ir antes de la variable 2, devuelve -1. Si son iguales, 0, y si var 2 debe ir antes de var 1, devuelve 1. Todavía no veo el equivalente aquí. –

Cuestiones relacionadas