Передача списка в запрос к базе данных

0 голосов
wolv33 в категории Как сделать...

Мне нужно извлекать из базы данных строго определенных пользователей, на основе имеющегося у меня файла с их идентификаторами. Узел "База данных" позволяет писать запросы, используя в них переменные, которые мы передаем в порт управляющих переменных. Так что я подумал, что можно передавать в качестве переменных эти самые идентификаторы. К сожалению, в моем случае количество данных идентификаторов составляет около половины миллиона записей.

Я попробовал переводить все эти идентификаторы в одну строку с помощью узла Javascript, из которой создаю переменную, передаваемую на порт управляющих переменных узла "База данных". Однако, в качестве параметра я эту переменную использовать не могу - натыкаюсь на ошибку max query size exceeded clickhouse, которая вызвана тем, что в переменной у меня записана СТРОКА вида "15435878,87456797,54687948,...". Таким образом, запрос SELECT * FROM epays WHERE player in (:player) у меня на выходе будет иметь вид select * from users where player in ("15435878,87456797,54687948,..."), а должен быть select * from users where player in (15435878,87456797,54687948,...).  Я не представляю, как сделать из этой строки нечто вроде массива целочисленных переменных.

Ответы: 2 шт.

0 голосов
Евгений Алябьев
 
Лучший ответ

В узле импорта из Базы Данных можно использовать переменные двух типов:

1) :VarID — при использовании двоеточия (:) в запросе учитывается тип передаваемой переменной (например int или string). Кроме того, количество этих переменных должно быть известно заранее. Получится наподобие: SELECT * FROM epays WHERE player in (:player1, :player2, :player3, ...). Этот вариант в Вашей задаче не подходит.


2) %Condition% — в тексте запроса будет заменена на строковое значение переменной Condition. В данном случае Ваш запрос следует записать так: SELECT * FROM epays WHERE player in (%player%).

0 голосов
Евгений Алябьев

Есть еще одно решение, с использованием SQL. Если есть возможность, то передавать большое количество значений явно табличного вида можно через временную таблицу (назовем ее SelectedPlayers) на сервере базы данных, а после использовать запрос:

SELECT * FROM epays JOIN SelectedPlayers ON epays.id = SelectedPlayers.id

galina.n.vorobeva

Добрый день.
Сейчас столкнулась со схожей проблемой.

На вход есть интеграция из базы данных в 25 млн строк. Есть файл Эксель, в который введены в столбик значения, к которым я буду подтягивать данные из БД.
Использовала функцию Таблица в переменные (на выходе получила переменную :Kod_VAZ), ее подаю на вход в импорт базы данных.

Попробовала использовать предложенный выше вариант SQL запроса, но таблица тогда выгружается пустая.
Подозреваю, что дело в том, как сформирована переменная на основании таблицы (перепробовала все варианты разделителей), но проблему так и не смогла решить. Сможете проконсультировать? 

SELECT * FROM avzХХХХХ.vd_mbom_3
WHERE vehicle in (%Kod_VAZ%)
 
elizaveta.l

Возможно вы получаете слишком много значений переменной и из-за этого превышаете лимит размера запроса. В таком случае, рекомендуем попробовать использовать способ, предложенный выше, с использованием временных таблиц. В таком случае запрос будет иметь подобный вид:

SELECT FROM epays JOIN SelectedPlayers ON epays.id = SelectedPlayers.id

...