在WHERE查询中使用数组作为比较

时间:2014-04-10 07:25:23

标签: c# sql arrays

我遇到了一个问题,我创建了长度各异的数组。这些数组包含名称,现在我想在WHERE查询中比较这些名称。

现在我正在考虑一个简单而好的解决方案,但我无法想到任何事情。

这是我想要做的一个例子:

array[?] names; //This is an array that holds names
sql Names = new SQLcommand("SELECT * FROM people WHERE name="the array names"",
                           _msConnection);

希望你有一个解决方案。

4 个答案:

答案 0 :(得分:3)

SQL就像这样:

WHERE name IN ('name1', 'name2', 'name3')

如果你想以狡猾的方式构建那个SQL,那么你可能会这样做:

sql = String.Format("SELECT * FROM people WHERE name IN ('{0}')", String.Join("', '", names))

如果您想以正确的方式查看如何操作,click here

答案 1 :(得分:2)

您可以将数组中的值列表作为单个列表传递。这是TVP。阅读更多here

好处:你可以传递相同类型和可变长度的大数组,并且比字符串替换和其他黑客更安全。

首先创建一个类型。

CREATE TYPE dbo.CategoryTableType AS TABLE (
      CategoryID int, CategoryName nvarchar(50))

然后使用此类型作为函数或SP的参数。

CREATE PROCEDURE usp_UpdateCategories (
    @tvpNewCategories dbo.CategoryTableType READONLY)

在C#中,根据类型创建对象:

SqlParameter tvpParam =
    command.Parameters.AddWithValue("@tvpNewCategories", dataReader);
tvpParam.SqlDbType = SqlDbType.Structured;

答案 2 :(得分:1)

尝试使用String.Replace()

string sql = "SELECT * FROM table_name WHERE name=$array$"

然后

sql  = sql.Replace("$array$", array[index]);

为数组索引执行循环。

答案 3 :(得分:0)

让我们说'names'是一个数组或字符串您可以使用String.Join()方法 它将seperater和一个数组作为Input,并在数组中给出包含逗号分隔项的字符串。以下希望是有帮助的。

var commaSeperatedNames = string.join(',',names);

var query = "SELECT * FROM people WHERE name IN (" + commaSeperatedNames + ")";