Estoy haciendo una function y una de mis características es hacer uso del operador SQL IN . Básicamente me gustaría una consulta como esta
select name from atlas_ins_th_travel_place pp where pp.name IN ('Guyana', 'Mexico'); Luego hago function y acepto varchar[] como una entrada como esta
CREATE OR REPLACE FUNCTION test_place( places VARCHAR[] ) RETURNS SETOF test_place_view AS $$ DECLARE dummy ALIAS FOR $1; BEGIN -- FOR i IN 1 .. array_upper(places, 1) -- LOOP -- RAISE NOTICE '%', places[i]; -- single quotes! -- array_append(dummy, places[i]) -- END LOOP; RETURN QUERY select name from atlas_ins_th_travel_place where name in places; END; $$ LANGUAGE plpgsql STABLE; Desafortunadamente, genera el error con respecto al operator . He intentado hacer una nueva matriz y usarla. pero no ayuda
Pregunta:
¿Cómo usar el operador IN con array ?
Necesita usar el operador ANY para esto. IN funciona con Listas, ANY funciona con Arrays select name from table where name = ANY(places)
El operador IN solo admite listas. No admite la búsqueda en una matriz. Deberías usar operator = ANY() .
postgres=# select 10 = ANY(ARRAY[10,20,30]); ┌──────────┐ │ ?column? │ ╞══════════╡ │ t │ └──────────┘ (1 row) postgres=# select 11 = ANY(ARRAY[10,20,30]); ┌──────────┐ │ ?column? │ ╞══════════╡ │ f │ └──────────┘ (1 row) o tal vez puede usar una función array_position (pero no se usarán estadísticas):
postgres=# select array_position(ARRAY[10,2,3], 10); ┌────────────────┐ │ array_position │ ╞════════════════╡ │ 1 │ └────────────────┘ (1 row) postgres=# select array_position(ARRAY[10,2,3], 11); ┌────────────────┐ │ array_position │ ╞════════════════╡ │ ∅ │ └────────────────┘ (1 row)Si una matriz es pequeña (< 100), entonces no es demasiado importante lo que use. Para matrices más grandes, probablemente sea mejor usar un operador. Pero depende del contexto.