使用SQL WHERE IN

时间:2017-01-01 11:14:19

标签: c# asp.net sql-server where

我在程序中检索多个复选框值时遇到问题。正如您在下面看到的那样,我正在尝试根据复选框列表中的一组值从我的数据库中检索。

如果我选择一个复选框值,数据库将能够检索该项目,但是如果我选择多于一个复选框值,则不会显示任何内容。有谁可以帮助我吗?我花了很多时间在上面。

我见过其他解决方案,但它似乎没有帮助我。谢谢。

protected void chkBoxCategories_SelectedIndexChanged(object sender, EventArgs e)
{
    // Create the list to store.
    List<String> YrStrList = new List<string>();

    // Loop through each item.
    foreach (ListItem item in chkBoxCategories.Items)
    {
        if (item.Selected)
        {
            // If the item is selected, add the value to the list.
            YrStrList.Add(item.Value);
        }
        else
        {
            // Item is not selected, do something else.
        }
    }

    // Join the string together using the ; delimiter.
    Session["UPCategories"] = String.Join(", ", YrStrList.ToArray());
}

以下代码位于另一页:

SqlDataSource1.SelectCommand = "SELECT sf.*, sfc.* FROM SkillsFuture sf INNER JOIN SkillsFutureCategory sfc ON sfc.SFCatID = sf.fkSFCatID WHERE sfc.SFCatName IN (@catnames) AND sf.SFPrice BETWEEN @min AND @max AND sf.SFCertStatus='Verified'";

SqlDataSource1.SelectParameters.Add("catnames", Session["UPCategories"].ToString());
SqlDataSource1.SelectParameters.Add("min", Convert.ToDecimal(Session["UPBudgetMin"]).ToString());
SqlDataSource1.SelectParameters.Add("max", Convert.ToDecimal(Session["UPBudgetMax"]).ToString());

SqlDataSource1.DataBind();

2 个答案:

答案 0 :(得分:-1)

你应该在@catnames中寻找的是'catname1','catname2'等。你正在使用,作为分隔符,但我没有看到你添加'',所以我希望在@ catnames变量你得到catname1,catname2等..这是行不通的。尝试:

 YrStrList.Add("'"+item.Value+"'");

答案 1 :(得分:-1)

在动态填充IN(...)子语句列表时,我也遇到了类似的麻烦。至少在PostgreSQL中,我不得不用WHERE子语句中的ANY分支替换IN(...),并将所需值的数组传递给语句,如下所示:

SELECT sf.*, sfc.* FROM SkillsFuture sf INNER JOIN SkillsFutureCategory
sfc ON sfc.SFCatID = sf.fkSFCatID WHERE sfc.SFCatName = ANY (@catnames) AND
sf.SFPrice BETWEEN @min AND @max AND sf.SFCertStatus='Verified'

@catnames将是sfc.SFCatName数据类型的数组。