Как я могу выполнить запрос postgresql над массивом строк? - PullRequest
0 голосов
/ 11 декабря 2018

Я пишу скрипт, который будет брать все таблицы из моей схемы и выполнять над ними некоторые действия.Таблицы, которые будут приняты, имеют одинаковый префикс и другой суффикс.Теперь я хочу объявить массив в начале скрипта, который будет содержать все регулярные выражения для всех нужных мне таблиц, например:

base_tables varchar[2] := ARRAY['table_name_format_2%',
                            'another_format_3%'];

Используя этот массив, я быхотел бы просмотреть все таблицы в моей схеме и взять только те, которые соответствуют шаблону имени в массиве.Я пытался сделать это следующим образом:

FOR table_item IN
    SELECT table_name 
    FROM information_schema.tables 
    WHERE table_name LIKE IN base_tables
    LOOP 
        ---- Some code goes here -----
    END LOOP; 

Я получаю ошибку:

ОШИБКА: синтаксическая ошибка в или около "IN"

Как правильно сравнивать каждое имя таблицы с именами в моем массиве?

Заранее спасибо.

1 Ответ

0 голосов
/ 11 декабря 2018

demo: db <> fiddle

Чтобы получить совпадение для элемента массива, вы должны использовать:

-- general case
WHERE element = ANY(ARRAY['elem1', 'elem2'])

-- your case
WHERE table_name = ANY(base_tables)

Если вы хотитеДля достижения операции LIKE eehrm ... вам понадобится другой способ:

SELECT table_name 
FROM information_schema.tables t
JOIN (SELECT unnest(base_tables) as name) bt
ON t.table_name LIKE bt.name

Объединение tables с необновленным массивом base_tables (unnest расширяет массив до одной строки для каждогоэлемент).Вы можете присоединиться к оператору LIKE.

demo: db <> fiddle

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