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

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

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

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

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

Ответ 1

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

SQL Server имеет очень большой предел:

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

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

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

Ответ 2

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

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)

Ответ 3

Параметрируйте запрос и передайте идентификаторы с помощью параметра Table Valued.

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

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)

Ответ 4

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

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

Ответ 5

Почему бы не сделать, где IN sub-select...

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

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

то...

SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )

Ответ 6

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

ВЫБРАТЬ * ИЗ таблицы ГДЕ (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

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

Ответ 7

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

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