0

传递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运算符。我希望它对其他人有用。 注意:我愿意接受建议和改进,因为我对编程世界很陌生。

4

1 回答 1

0

所以让我们假设你有一个IList<int> items包含 2300 个项目的项目。

由于 1000 个项目是限制,让我们将其分解并像这样循环

DataTable dt;
int iterator = items.Count / 1000;
int remainder = items.Count % 1000;

for (int i = 0; i < iterator; i++)
{
    if (i ==0)
        dt = new DataTable();

    //Get 1000 items for the in clause
    var inStr = string.Join(items.Take(1000).skip(i*1000).ToArray(),',');
    // Build the sql query
    var query = string.Format("Select col1, col2, col3 from tablename where col4 IN ({0})", inStr);
    // Execute the query and add the items to the data table
    dt.Merge(// DataTable from the query);
}

var finalIn = string.Join(items.Take(remainder).Skip(iterator*1000).ToArray(), ',');
// Build and execute the query for the final time and add to dt again
dt.Merge(// DataTable from the query);

如果您有字符串或其他内容,请根据需要修改代码。

于 2017-02-15T11:00:18.017 回答