传递string[] 列表以使用IN运算符从 db 检索数据。
Select col1, col2, col3 from tablename where col4 IN (// the list goes here);
列表中的项目数可以超过 1000,并且由于 Oracle 不允许在列表中传递超过 1000 个表达式,我正在寻找替代方法。现在的问题:
1:我不想在数据库中创建临时表,因为我没有足够的权限。
2:不确定多个 IN 是否会起作用,因为列表是动态的并且要求没有。IN运算符的可能会改变
所以这是我想做但不知道如何做的事情:
SELECT col1, col2, col3 from tablename where col4 IN (Select col4 from "string[]list";)
有没有办法在嵌套的 select 语句中使用这个列表?或者在考虑上述问题的同时使用超过 1000 个表达式的任何其他替代方法?任何帮助,将不胜感激。谢谢 !
PS我已经简化了查询以向愿意提供帮助的人们提供一个想法。原来的查询远不止这些!
更新
因此,在@Barry O'Kane 向我展示了解决此问题的方法之后,我想出了以下解决方案:
IEnumerable<string> List = arrExcelItems; //arrExcelItems is the actual list with more than 1000 expressions
IList<IEnumerable<string>> listofLists = new List<IEnumerable<string>>();
List<string> listtoQuery = new List<string>();
string strCompList = null;
string extQuery = null;
string extQuery = null; string Query = "Select col1, col2, col3 from tablename where col4 IN ";
for (int i = 0; i < List.Count(); i += 20)
{
listofLists.Add(List.Skip(i).Take(20).ToList()); //Adding every 20 items of list to the listoflists[i] index
for (int j = 0; j < listofLists.Count; j++) //possibility of improving OR removing this for loop and use only string.Join method.
{
strCompList = string.Join("','", listofLists[j].ToArray());
}
strCompList = "('" + strCompList + "')"; //concatenating every list in listofLists[i] for IN operator
arrList.Add(strCompList);
}
for (int i = 0; i < listtoQuery.Count; i++)
{
extquery = string.Join(" OR IN ", listtoQuery); //
}
Query += extQuery;
//resultant query after concatenation
Query = "Select col1, col2, col3 from tablename where col4 IN listtoQuery[0] OR col4 IN listtoquery[1] OR col4 IN....";
所以最后我找到了一个解决方案,我可以将我的列表划分为多个列表,并将它们分别传递给多个IN运算符。我希望它对其他人有用。 注意:我愿意接受建议和改进,因为我对编程世界很陌生。