我正在使用以下代码:
SELECT * FROM table
WHERE Col IN (123,123,222,....)
但是,如果我在IN
子句中放入超过~3000个数字,则SQL会抛出错误。
有没有人知道是否有尺寸限制或类似的东西?!!
答案 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年的表值参数或此处描述的某种方法:
答案 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),....)
这些数量没有限制。它比较了对。