Итерация по массиву строк в postgresql - PullRequest
0 голосов
/ 12 сентября 2018

Я очень новичок в SQL. Все еще изучаю. Я знаю, что postgres может хранить массив данных, но как мне выполнить операции с этими данными? У меня есть массив строк n-длины, предоставленный пользователем. Я хочу проверить, есть ли каждая строка в таблице, прежде чем вставлять ее.

Я сделал попытку, но я не знаю, правильно ли я это делаю. Я подключаюсь к БД с помощью Massive, если это помогает любому

Запрос сделан с массивом передаваемых строк.

DECLARE
  a text[] = $1
FOREACH i IN ARRAY a
LOOP 

DO 
$do$
BEGIN
  IF NOT EXISTS (SELECT tag_id FROM test_table WHERE tag_name = i) THEN
    INSERT INTO test_table (tag_name) 
    VALUES ($1);
END IF;
END
$do$

END LOOP;

У меня есть «ошибка: синтаксическая ошибка в или около текста», но это может быть наименьшей из моих проблем.

1 Ответ

0 голосов
/ 12 сентября 2018

Вместо LOOP вы можете unnest массив, а затем проверить, есть ли значения в другой таблице, например:

INSERT INTO test (tag_name)
SELECT tag_name
FROM (SELECT unnest(a) AS tag_name) AS arr -- unnest the array and use like a table
WHERE NOT EXISTS (SELECT 1 FROM test_table WHERE tag_name = arr.tag_name) -- ensure tag_name is NOT in the test_table

При этом будут вставлены только значения из массива, которые еще не перечислены в test_table.

Документация: https://www.postgresql.org/docs/current/static/functions-array.html

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