Ограничить условие WHERE col IN (…)

Я использую следующий код:

SELECT * FROM table
WHERE Col IN (123,123,222,....)

Тем не менее, если я поставлю более ~ 3000 номеров вIN предложение, SQL выдает ошибку.

Кто-нибудь знает, есть ли ограничение по размеру или что-то подобное? !!

 Travis J02 дек. 2014 г., 00:39
Разделите числа в предложении IN по группам, достаточно большим для обработки, и выполните асинхронную обработку их всех одновременно.

Ответы на вопрос(7)

Существует ограничение, но вы можете разделить ваши значения на отдельные блоки in ()

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)
 25 февр. 2019 г., 10:54
@ MichaelK.Campbell. Можете ли вы предоставить несколько ссылок о том, что IN () не SARGable & quot ;? И насколько это важно? Производительность может снизиться на 200%?
 24 апр. 2017 г., 21:01
IN () не может быть SARGable. Вы гораздо лучше запихиваете свои параметры во временную таблицу или TVP, а затем используете INNER JOIN.
 12 июн. 2017 г., 05:53
какой лимит на запрос выше? Я имею в виду, сколько предложений IN я могу определить с помощью OR?
Решение Вопроса

В зависимости от используемого вами механизма базы данных могут быть ограничения на длину инструкции.

SQL Server имеет очень большое ограничение:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

У ORACLE очень легко достичь предела с другой стороны.

Так что для больших предложений IN лучше создать временную таблицу, вставить значения и выполнить JOIN. Это работает быстрее также.

 01 июл. 2009 г., 16:43
неправильно. Максимальный размер инструкции SQL или пакета составляет 65 КБ * (размер сетевого пакета, который обычно составляет 4 КБ) = более 250 МБ ...msdn.microsoft.com/en-us/library/ms143432.aspx .
 01 июл. 2009 г., 16:50
Вы прокляты прямо на месте, я дополнил ответ. Кстати, в ORACLE этот предел ОЧЕНЬ легко достичь!

Вы можете использовать кортежи так: SELECT * FROM table ГДЕ (Col, 1) IN ((123,1), (123,1), (222,1), ....)

Нет ограничений по количеству таких. Он сравнивает пары.

 10 окт. 2017 г., 09:47
Нет, в SQL Server вы не можете. SQL Server использует T-SQL, который не совместим с ANSI SQL (как и любой другой диалект).
 23 янв. 2019 г., 10:22
Этот безобразный хак работает только в Oracle SQL, смотритеasktom.oracle.com/pls/asktom/…

Вы не указали движок базы данных - это вопрос; в Oracle можно использовать следующие кортежи:

SELECT * FROM table ГДЕ (Col, 1) IN ((123,1), (123,1), (222,1), ....)

Этот безобразный хак работает только в Oracle SQL, смотритеhttps://asktom.oracle.com/pls/asktom/asktom.search?tag=limit-and-conversion-very-long-in-list-where-x-in#9538075800346844400

Однако гораздо лучшим вариантом является использование хранимых процедур и передача значений в виде массива.

Параметризовать запрос и передать идентификаторы с помощьюТабличный параметр.

Например, определите следующий тип:

CREATE TYPE IdTable AS TABLE (Id INT NOT NULL PRIMARY KEY)

Наряду со следующей хранимой процедурой:

CREATE PROCEDURE sp__Procedure_Name
    @OrderIDs IdTable READONLY,
AS

    SELECT *
    FROM table
    WHERE Col IN (SELECT Id FROM @OrderIDs)
 26 июл. 2017 г., 17:34
@Jason@OrderIds является табличным параметром. Он существует только на время процедуры.
 26 июл. 2017 г., 17:26
я знаю, что это старый ответ, но знаете ли вы, что происходит с вашими OrderIds? это осталось? или это просто временный файл?
 05 июл. 2016 г., 10:37
Я не знаю, почему за вас проголосовали, потому что это абсолютно правильное решение. Хотя я бы изменилSelect Id FROM @OrderIDs присоединиться.

Почему бы не сделать, где в суб-выберите ...

Предварительный запрос во временную таблицу или что-то ...

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

затем...

SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )
 06 мар. 2014 г., 12:10
Не будет ли существующее положение еще лучше?
 01 июл. 2009 г., 20:43
Лучше сделать соединение с временной таблицей, чем, как правило, подвыбор.

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

Массивы и списки в SQL Server 2005

Ваш ответ на вопрос