Query usando un arreglo en un «WHERE id IN ()»

Muy a menudo hacemos queries usando select … where id in (…), por ejemplo:

SELECT id,nombre FROM ejemplo_select_in WHERE edad IN (20,25,50);

Esto es distinto cuando lo queremos hacer en un Store Procedure (SP), y queremos usar un arreglo como parámetro, ya que no usamos la clausula IN, veamos como hacerlo.

Usemos la siguiente tabla para el ejemplo:

id
nombre
edad
1
nombre 1
20
2
nombre 2
20
3
nombre 3
20
7
nombre 7
25
4
nombre 4
50
5
nombre 5
50
6
nombre 6
25

ejemplo:

Si quisieramos obtener los que tengan 20 años haríamos un SP de la siguiente manera: (el ejemplo es trivial pero práctico)

CREATE OR REPLACE FUNCTION sp_get_personas(_edad INTEGER) RETURNS SETOF type_select_in AS
$BODY$
DECLARE
retval record;
BEGIN
FOR retval IN
SELECT * FROM ejemplo_select_in WHERE edad = _edad LOOP
RETURN NEXT retval;
END LOOP ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Al ejecutar SELECT * FROM sp_get_personas(25) obtendríamos:

id
nombre
edad
7
nombre 7
25
6
nombre 6
25

Para poder obtener aquellos que tengan 20 y 25 años cambiaríamos el SP y en vez de usar select in usaríamos la función ANY():

CREATE OR REPLACE FUNCTION sp_get_personas(_edad INTEGER[]) RETURNS SETOF type_select_in AS
$BODY$
DECLARE
retval record;
BEGIN
FOR retval IN
SELECT * FROM ejemplo_select_in WHERE edad = ANY(_edad) LOOP
RETURN NEXT retval;
END LOOP ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

Al ejecutar SELECT * FROM sp_get_personas(25,50) obtendríamos:

id
nombre
edad
7
nombre 7
25
4
nombre 4
50
5
nombre 5
50
6
nombre 6
25

La función ANY(), no es de uso común y en estos casos es la mejor opción.

Les dejo con los Scripts .
Espero que les sirva, Hasta la próxima!.