不能在IN Expression CFQUERY中放置超过1000个元素

use*_*572 3 sql oracle coldfusion

在Oracle中,我们可以放入"in"表达式中的元素数量限制为1000.我们的代码中有一个查询:

<cfquery>
SELECT * from table1 where ID IN (#somelist#)
</cfquery>
Run Code Online (Sandbox Code Playgroud)

#somelist#是CF列表变量.

什么是解决这个问题的CF最合适的解决方案?

Mar*_*ona 9

这可能是一个驱动程序限制,但当然如果你需要将列表中的1000个项目传递给内联查询,我会说你的架构在某个地方存在缺陷.

如果你能告诉我们为什么你需要做这样的事情,以及你想要完成的事情,那将是很好的,因为我可能能够进一步帮助你.

原则上(如果该查询是不可避免的),我会说你可以简单地做一些事情:

SELECT * from table1 where ID IN (<cfqueryPARAM value = "#somelist#" CFSQLType = "CF_SQL_VARCHAR">) OR ID IN (<cfqueryPARAM value = "#somelist2#" CFSQLType = "CF_SQL_VARCHAR">) ...
Run Code Online (Sandbox Code Playgroud)

例如,您可以将其分解为500个块.

更新: 添加了cfqueryparam以避免SQL注入

  • +1使用CFQUERYPARAM.不使用它的唯一原因是在CF7中,当缓存查询不支持它时.现在没有任何借口. (2认同)
  • 我真的只想强调并突出马科斯的第一段.如果您传递的是1000个项目的列表,那么您真的需要查看应用程序架构.当然,这可以通过一些不错的SQL或者对您的应用程序结构进行一些重新思考来解决? (2认同)
  • 它不是驱动程序限制,而是Oracle SQL限制. (2认同)

Vin*_*rat 9

使用临时表.将Ids插入temp,并查询:

SELECT * from table1 where ID IN (SELECT id FROM temp_table)
Run Code Online (Sandbox Code Playgroud)

请参阅SO上的这个问题:如何将超过1000个值放入Oracle IN子句中.

看起来你正在做一个简单的替换.从性能的角度来看,这是一个糟糕的主意,从安全的角度来看,这是一个非常糟糕的主意(SQL注入).我不知道CF,但我很确定你可以使用绑定变量.