Как преобразовать список произвольных значений в подзапрос, который можно использовать в соединении - PullRequest
0 голосов
/ 07 мая 2020

Я хочу объединить список значений со строками таблицы в SQL.

Вкратце, у меня есть список элементов, и я хочу join этот элемент с данной таблицей.

Например, мой список (1,3,5,100,200,700), а table:

id | val
 1 |  a
 2 |  b
 3 |  c
 4 |  d
100|  e
200|  f

Я знаю, как это сделать с предложением in:

 SELECT * FROM table 
 WHERE id IN(list)

К сожалению, в моей ситуации (очень-очень длинный список) я не могу использовать предложение in и требуется использовать join с этим списком.

Как преобразовать список (в формате, который "in" может иметь дело) с чем-то, что может быть объединено.

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

Не могли бы вы мне помочь, пожалуйста?

1 Ответ

3 голосов
/ 07 мая 2020

Если этот список является строкой, вы можете, например, заменить круглые скобки фигурными скобками и преобразовать его в массив:

where id = any('{1,3,5,100,200,700}'::int[])

Или, если вы не можете изменить ввод:

where id = any(translate('(1,3,5,100,200,700)', '()', '{}')::int[])

Тот же подход можно использовать для объединения:

select mt.*
from my_table mt
  join unnest('{1,3,5,100,200,700}'::int[]) as x(id) on x.id = mt.id

Но эти два решения не одинаковы: если список содержит дубликаты, соединение также вернет повторяющиеся строки. Условие id = any() этого не сделает.

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