首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于过滤SubSet数据的SQL

用于过滤SubSet数据的SQL
EN

Stack Overflow用户
提问于 2010-06-03 00:45:39
回答 5查看 1.1K关注 0票数 0

我有一个数组列表,其中包含在我的数据库中找到的名称的子集。我需要写一个查询来获得某些部分的数组列表中的人数,例如,在我的数据库中有一个字段"City“,来自数组列表中的人,我想知道他们中有多少人住在芝加哥,有多少人住在纽约等。

有人能帮我设置一条sql语句来处理这个问题吗?我想我必须以某种方式将名称的子集传递给sql。

下面是我如何在代码中编写sql的示例

代码语言:javascript
复制
Public Shared Function GetCAData(ByVal employeeName As String) As DataTable
        Dim strQuery As String = "SELECT EMPLID, EMPLNME, DISP_TYPE, BEGIN_DTE FROM Corr WHERE (EMPLNME = @name)"
        Dim cmd As New SqlCommand(strQuery)
        cmd.Parameters.Add("@name", SqlDbType.VarChar)
        cmd.Parameters("@name").Value = employeeName
        Dim dt As DataTable = GenericDataAccess.GetData(cmd)
        Return dt
End Function

我需要一种方法来创建一个函数,使用您的sql语句返回一个名称的datatable对象,参数是城市和名称列表。

上面的例子不是我正在寻找的sql,它只是我想要创建的函数的骨架。

因此,您可以通过遍历所有城市来使用该函数,每次在fron末尾传递相同的名称集。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-03 00:59:36

最好的方法取决于名称的子集有多大。

最简单,也可能是最糟糕的方法是创建一些动态sql,如下所示。

代码语言:javascript
复制
"select city,count(*) from table where user in ("name1","name2","name3") GROUP BY city"

其中in段是从arraylist生成的,可能如下所示

代码语言:javascript
复制
private string CreateSQL(List<string> names)
{
    var sb = new StringBuilder();
    sb.Append("select city,count(*) from table where user in ('");
    foreach ( var name in name)
    {
       sb.Append("'");
       sb.Append(name);
       sb.Append("',");
    }
    sb.Remove(sb.Length-1,1); //remove trailing ,
    sb.Append(") GROUP BY city");

    return sb.ToString();
}

我相信where in子句有100个条目的限制。如果您的子集是这样的长度,那么您确实需要一种更好的方法,比如将用户放到另一个表中并进行连接。事实上,如果用户的子集是由另一个查询从同一数据库中获取的,那么post它,我们将对单个查询进行正确的处理。

编辑:实际上我不知道如何将SQL型查询作为参数化命令,小心where user in注入!

票数 0
EN

Stack Overflow用户

发布于 2010-06-03 00:49:29

您的Sql语句需要如下所示:

代码语言:javascript
复制
select city, count(*)
from table
where city in ('Chicago', 'New York')
group by city

其中城市列表是您的数组列表。您可以将其作为变量传递到存储过程中,也可以在代码中动态构建Sql字符串。

票数 1
EN

Stack Overflow用户

发布于 2010-06-03 01:17:51

如果您使用的是SQL Server 2008,则可以使用表变量作为输入参数来创建存储的proc。然后,在proc中,您只需连接到输入参数表,即可获得您想要的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2959754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档