处理 Oracle SQL in 超过1000 的解决方案
程序员文章站
2024-03-02 19:06:04
...
处理oracle sql 语句in子句中(where id in (1, 2, ..., 1000, 1001)),如果子句中超过1000项就会报错。
这主要是oracle考虑性能问题做的限制。如果要解决次问题,可以用 where id (1, 2, ..., 1000) or id (1001, ...)
解决方案1:
public string GetSqlIn( string sqlParam, string columnName )
{
int width = sqlParam.IndexOf( "'", 1 ) - 1;
string temp = string.Empty;
for( int i = 0; i < sqlParam.Length; i += 1000 * ( width + 3 ) )
{
if( i + 1000 * ( width + 3 ) - 1 < sqlParam.Length )
{
temp = temp + sqlParam.Substring( i, 1000 * ( width + 3 ) - 1 )
+ ") OR " + columnName + " IN (";
}
else
{
temp = temp + sqlParam.Substring( i, sqlParam.Length - i );
}
}
return temp;
}
使用这个方法的返回值,代码如下:
System.Text.StringBuilder sql = new System.Text.StringBuilder("");
sql.Append ( " SELECT " );
sql.Append ( " T.A" );
sql.Append ( " FROM TEST T" );
sql.Append ( " WHERE 1=1 " );
if( Col.Length > 0 )
{
string sqlStr = GetSqlIn( Col, "ColName" );
sql.Append ( " AND T.Col IN ( " + sqlStr + " )" );
}
sql.Append ( " ORDER BY T.A" );
运行后得到的SQL字符串格式为:
select t.* from TEST t where t.A in (59,60) or t.A in (61,62)
备注:来自于hoojo
说明:保证每个括号内个数不超过一千,就可以。执行效率可能比较低下。
解决方案2:
建立一个中间的temp表存在查询条件,在数据库内部进行直接查询
select * from table_1 where column_1 in ( select column_2 from table_2_temp )
解决方案3:
如果IN里面的数据是从别的表取的话,可以直接这样编写sql语句
select * from table_1 where column_1 in ( select column_2 from table_2 ,....... )
备注:作者xiaomgee
解决方案4:
where not in
对于where column ont in (A,B,C,D……) 这样的语句,与其等价的是where column not in (A,B……) and column not in(C,D……)。
上一篇: 浅谈基于Token的WEB后台认证机制
下一篇: Java并发编程之重入锁与读写锁
推荐阅读
-
处理 Oracle SQL in 超过1000 的解决方案
-
Oracle配置OneMap中的sql数据库问题及解决方案
-
Oracle配置OneMap中的sql数据库问题及解决方案
-
SQL Server2008安装报错,解决方案(创建 system.diagnostics 的配置节处理程序时出错)
-
MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理
-
MS SQL Server2014链接到MS SQL Server 2000的解决方案及问题处理
-
oracle数据结构之SQL格式的执行顺序及SQL查询处理的步骤序号
-
用户为scott时,用pl/sql登录oracle,报错问题的解决方案
-
Oracle SQL Developer连接报错(ORA-12505)的解决方案(两种)
-
Oracle的SQL语句中如何处理‘’符号