Оптимальный способ УСТАНОВИТЬ / ОБЪЯВИТЬ список в SQL-запросе?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я пишу SQL-запрос на основе пользовательского ввода, так как эти входные данные будут меняться ежедневно.

Цель запроса — извлечь все данные только для идентификаторов в пользовательском списке. Пример ниже-

Однако я получаю следующую ошибку:

«Ошибка преобразования при преобразовании varchar […] в тип данных int»

Есть идеи о том, каков оптимальный способ указать список и использовать этот список в предложении «ID in (..)»? Я попытался преобразовать список идентификаторов в строки, но все равно получаю аналогичную ошибку.

 id_list = [12,16,22,42,1,24] 
date = '2020-12-18'

query = (
   """
   DECLARE @id varchar(1000), @date datetime
   
   SET @id = '{}'
   SET @date = '{}'

   SELECT * from TABLE where ID in (@id) and Date = @Date
   """
   .format(id_list,date))
 

Желаемый результат заключается в том, чтобы запрос мог получать список идентификаторов, которые могут быть использованы в предложении.

идентификатор в @id

Комментарии:

1. Вы имели в виду .format(id_list, date) ? Вы распечатали SQL-запрос и проверили его по документации на правильность синтаксиса? Абстрагируйтесь от Python здесь, чтобы упростить ваш вопрос.

2. Я добавил тег SQL Server, потому что синтаксис выглядит как SQL Server.

3. @AsteroidsWithWings, спасибо за это — сделано.

Ответ №1:

SQL Server не поддерживает списки или массивы. Итак, лучшим методом является таблица:

 declare @id_list table (id int);

insert into @idlist (id)
    values (12), (16), (22), (42), (1), (24);
 

Затем вы можете использовать это везде, где вы использовали бы табличную переменную. Например:

 where id in (select id from @id_list)
 

Комментарии:

1. есть ли более простой способ вставить val в эту таблицу, возможно, через цикл? @gordon

2. Если у вас есть значения в таблице, вы можете просто вставить их. Если вы хотите представить это как цикл, вы можете думать о «значении» как о «где». Или поместите их в строку и разделите строку.

3. это работает просто отлично. Спасибо за информацию @Gordon. Счастливых праздников