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!.