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

jDe*_*per 63 sql t-sql sql-server

我正在使用以下代码:

SELECT * FROM table
WHERE Col IN (123,123,222,....)
Run Code Online (Sandbox Code Playgroud)

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

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

tek*_*ues 66

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

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

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

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

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

  • 不正确.SQL指令或批处理的最大大小为65K*(网络包大小通常为4K)=超过250 Mb ... http://msdn.microsoft.com/en-us/library/ms143432.aspx. (4认同)

Iai*_*ult 33

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

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)
Run Code Online (Sandbox Code Playgroud)


Gre*_*reg 12

参数化查询并使用表值参数传递ID .

例如,定义以下类型:

CREATE TYPE IdTable AS TABLE (Id INT NOT NULL PRIMARY KEY)
Run Code Online (Sandbox Code Playgroud)

连同以下存储过程:

CREATE PROCEDURE sp__Procedure_Name
    @OrderIDs IdTable READONLY,
AS

    SELECT *
    FROM table
    WHERE Col IN (SELECT Id FROM @OrderIDs)
Run Code Online (Sandbox Code Playgroud)

  • 我不知道你为什么被低估,因为这是一个完全有效的解决方案。尽管我将 `Select Id FROM @OrderIDs` 更改为连接。 (2认同)

DRa*_*app 5

为什么不做一个 where IN 子选择...

预查询到临时表或其他东西......

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething
Run Code Online (Sandbox Code Playgroud)

然后...

SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )
Run Code Online (Sandbox Code Playgroud)

  • 与通常的子选择相比,更好地加入临时表。 (3认同)