对 WHERE colin (...)条件的限制

我使用以下代码:

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

但是,如果在 IN子句中输入超过3000个数字,SQL 将抛出一个错误。

有人知道有没有尺寸限制之类的吗!

120054 次浏览

根据所使用的数据库引擎,可以对指令的长度进行限制。

SQLServer 有一个非常大的限制:

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

甲骨文有一个非常容易达到另一方的限制。

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

有一个限制,但是您可以将您的值分割成 in ()的单独块

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

为什么不做一个在哪里在一个子选择..。

预查询到临时表之类的..。

CREATE TABLE SomeTempTable AS
SELECT YourColumn
FROM SomeTable
WHERE UserPickedMultipleRecordsFromSomeListOrSomething

然后..。

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

根据您的版本,在2008年使用一个表值参数,或者这里描述的一些方法:

SQLServer2005中的数组和列表

参数化查询并使用 表值参数传递 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)

您可以像下面这样使用元组: 从表中选择 * 其中(Col,1) IN ((123,1) ,(123,1) ,(222,1) ,... .)

它们的数量没有限制,只是比较对数。

您没有指定有问题的数据库引擎; 在 Oracle 中,一个选项是像下面这样使用元组:

SELECT * FROM table
WHERE (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

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

对于 MSSQL2016,将 int 传入 in,它似乎可以处理近38,000条记录。

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

我通过简单地使用范围来解决这个问题

WHERE Col >= 123 AND Col <= 10000

然后通过循环应用程序代码删除指定范围内的不需要的记录。这对我来说很有效,因为我一直在循环记录,忽略几千条记录也没有什么不同。

当然,这不是一个通用的解决方案,但它可以工作的情况下,如果最小和最大的大多数值是必需的。