限制WHERE col IN(...)条件

时间:2009-07-01 14:25:41

标签: sql sql-server tsql

我正在使用以下代码:

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

但是,如果我在IN子句中放入超过~3000个数字,则SQL会抛出错误。

有没有人知道是否有尺寸限制或类似的东西?!!

8 个答案:

答案 0 :(得分:62)

根据您使用的数据库引擎,指令的长度可能会有限制。

SQL Server有一个非常大的限制:

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

ORACLE在另一方面很容易达到限制。

因此,对于大型IN子句,最好创建临时表,插入值并执行JOIN。它的工作速度也更快。

答案 1 :(得分:33)

有一个限制,但您可以将值拆分为in()

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

答案 2 :(得分:10)

参数化查询并使用Table Valued Parameter传递ID。

例如,定义以下类型:

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)

答案 3 :(得分:4)

根据您的版本,请使用2008年的表值参数或此处描述的某种方法:

Arrays and Lists in SQL Server 2005

答案 4 :(得分:3)

为什么不在子选择中进行操作...

预先查询临时表或其他内容......

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

...然后

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

答案 5 :(得分:0)

您未指定数据库引擎是问题;在Oracle中,一种选择是使用这样的元组:

SELECT * FROM表 在(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

但是,更好的选择是使用存储过程并将值作为数组传递。

答案 6 :(得分:0)

对于MS SQL 2016,将int传递给in,看起来它可以处理近38,000条记录。

select * from user where userId in (1,2,3,etc)

答案 7 :(得分:-3)

你可以使用这样的元组: SELECT * FROM表 WHERE(Col,1)IN((123,1),(123,1),(222,1),....)

这些数量没有限制。它比较了对。