Я использую следующий код:
SELECT * FROM table
WHERE Col IN (123,123,222,....)
Однако, если я помещаю более ~ 3000 номеров в предложение IN
, SQL вызывает ошибку.
Кто-нибудь знает, есть ли ограничение по размеру или что-то подобное?!!
Я использую следующий код:
SELECT * FROM table
WHERE Col IN (123,123,222,....)
Однако, если я помещаю более ~ 3000 номеров в предложение IN
, SQL вызывает ошибку.
Кто-нибудь знает, есть ли ограничение по размеру или что-то подобное?!!
В зависимости от используемого вами механизма базы данных могут быть ограничения на длину инструкции.
SQL Server имеет очень большой предел:
http://msdn.microsoft.com/en-us/library/ms143432.aspx
ORACLE имеет очень легкий предел на другой стороне.
Итак, для больших предложений IN лучше создать временную таблицу, вставить значения и сделать JOIN. Он работает быстрее.
Существует предел, но вы можете разделить свои значения на отдельные блоки in()
Select *
From table
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)
Параметрируйте запрос и передайте идентификаторы с помощью параметра 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)
В зависимости от вашей версии в 2008 году используйте параметр таблицы, или какой-либо подход, описанный здесь:
Почему бы не сделать, где IN sub-select...
Предварительный запрос в таблицу temp или что-то еще...
CREATE TABLE SomeTempTable AS
SELECT YourColumn
FROM SomeTable
WHERE UserPickedMultipleRecordsFromSomeListOrSomething
то...
SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )
Вы не указали рассматриваемый движок базы данных; в 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
Однако гораздо лучшим вариантом является использование хранимых процедур и передача значений в виде массива.
Вы можете использовать кортежи следующим образом: SELECT * FROM table ГДЕ (Col, 1) IN ((123,1), (123,1), (222,1),...)
Нет никаких ограничений на их количество. Он сравнивает пары.