У меня есть запрос Transact-SQL, который использует оператор IN. Что-то вроде этого:
select * from myTable where myColumn in (1,2,3,4)
Есть ли способ определить переменную для хранения всего списка "(1,2,3,4)"? Как мне это определить?
declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList
Ответы:
источник
источник
[Err] 42000 - [SQL Server]Must declare the scalar variable "@mylist".
(VALUES (1),(2),(3),(4),(5))
напрямую?Существует два способа решения динамических списков csv для запросов TSQL:
1) Использование внутреннего выбора
2) Использование динамически сцепленного TSQL
3) Возможный третий вариант - это переменные таблицы. Если у вас SQl Server 2005, вы можете использовать табличную переменную. Если вы используете Sql Server 2008, вы можете даже передавать переменные всей таблицы в качестве параметра хранимым процедурам и использовать его в объединении или в качестве подвыбора в предложении IN.
источник
Используйте такую функцию:
Вместо использования like вы создаете внутреннее соединение с таблицей, возвращаемой функцией:
становится
В неиндексированной таблице записей 1М вторая версия заняла примерно половину времени ...
ура
источник
Обратите внимание, что для длинных списков или производственных систем не рекомендуется использовать этот способ, так как он может быть намного медленнее, чем простой
IN
операторsomeColumnName in (1,2,3,4)
(тестируется с использованием списка элементов более 8000)источник
Нет, такого типа нет. Но есть несколько вариантов:
Ни один из них не является действительно изящным, но это лучшее, что есть.
источник
небольшое улучшение в @LukeH, нет необходимости повторять «INSERT INTO»: и ответ @ realPT - нет необходимости иметь SELECT:
источник
Я знаю, что это старый, но TSQL => 2016, вы можете использовать STRING_SPLIT:
источник
Начиная с SQL2017, вы можете использовать STRING_SPLIT и сделать это:
источник
Если вы хотите сделать это без использования второй таблицы, вы можете сделать LIKE сравнение с CAST:
Если сравниваемое поле уже является строкой, вам не нужно делать CAST.
Окружение совпадения столбцов и каждого уникального значения в запятых обеспечит точное совпадение. В противном случае значение 1 будет найдено в списке, содержащем ', 4,2,15,'
источник
Как никто не упоминал ранее, начиная с Sql Server 2016, вы также можете использовать массивы json и
OPENJSON (Transact-SQL)
:Вы можете проверить это в sql fiddle demo
Вы также можете проще охватить более сложные случаи с помощью json - см. Поиск списка значений и диапазона в SQL с использованием предложения WHERE IN с переменной SQL?
источник
Он использует PATINDEX для сопоставления идентификаторов из таблицы с целочисленным списком без разделителей.
Ноты:
источник
источник
Я думаю, вам придется объявить строку, а затем выполнить эту строку SQL.
Посмотрите на sp_executeSQL
источник