Postgres Оператор IN вызывает ОШИБКУ: синтаксическая ошибка на уровне или рядом с array_variable - PullRequest
0 голосов
/ 19 июня 2020

Я делаю function, и одна из моих функций - использовать оператор SQL IN. В основном мне нужен такой запрос

select name
from atlas_ins_th_travel_place pp
where pp.name IN ('Guyana', 'Mexico');

Затем я делаю function и принимаю varchar[] в качестве ввода, подобного этому

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;

К сожалению, это вызывает ошибку относительно operator . Я пробовал создать новый массив и использовать его. Но не помогает

Вопрос:

Как использовать оператор IN с array?

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Для этого нужно использовать оператор ЛЮБОЙ. IN работает со списками, ЛЮБОЙ работает для массивов select name from table where name = ANY(places)

0 голосов
/ 19 июня 2020

Оператор IN поддерживает только списки. Он не поддерживает поиск в массиве. Вам следует использовать оператор = 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)

или, возможно, вы можете использовать функцию array_position (но там статистика не будет использоваться):

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)

Если массив маленький (<100), то не так уж важно, что вы используете. Для больших массивов, вероятно, лучше использовать оператор. Но это зависит от контекста. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...