【问题标题】:Filter select from database using dropdownlists使用下拉列表过滤从数据库中选择
【发布时间】:2014-02-05 20:08:18
【问题描述】:

我的 asp.net 网络表单应用程序中有 6 个下拉列表、2 个文本框和一个按钮的搜索页面。单击按钮后,我需要将过滤后的数据选择到转发器组件。当用户使用 SQL 选择命令在所有下拉列表中选择一些值时,我可以这样做。

SELECT * FROM Profiles WHERE (Sport = @Sport, Region = @Region, Name LIKE @Name,...)

但是当用户留下一些下拉列表或文本框为空时,SQL 命令不会显示任何内容。谁能帮帮我,如何解决这个问题?

编辑: 我修改了查询,但还是不行。

SELECT Profiles.ProfileId,Profiles.ProPicUrl, Profiles.Name, Profiles.Specialization, UsersSports.Rating " + _
                             "FROM Profiles " + _
                                 "JOIN UsersSports ON Profiles.ProfileId = UsersSports.ProfileId " + _
                                "WHERE (UsersSports.SportId = CASE WHEN @SportId != '' THEN @Sport ELSE UsersSports.SportId END) AND (Region = CASE WHEN @Region != '' THEN @Region ELSE Region END) AND (Specialization = CASE WHEN @Specialization != '' THEN @Specialization ELSE Specialization END)" + _
                                        "AND (Sex = CASE WHEN @Sex != '' THEN @Sex ELSE Sex END) AND ((@AgeFrom IS NOT NULL AND @AgeTo IS NOT NULL AND Age BETWEEN @AgeFrom AND @AgeTo) OR (@AgeFrom IS NULL AND @AgeTo IS NULL AND Age)) " + _
                                        "AND ((@PractiseFrom IS NOT NULL AND @PractiseTo IS NOT NULL AND Practise BETWEEN @PractiseFrom AND @PractiseTo) OR (@PractiseFrom IS NULL AND @PractiseTo IS NULL AND Practise))" + _
                                        "AND ((@Name IS NOT NULL AND Name LIKE '%@Name%') OR (@Name IS NULL AND Name))  AND ((@City IS NOT NULL AND City LIKE '%@City%') OR (@City IS NULL AND City))" + _
                                "ORDER BY UsersSports.Rating ASC

【问题讨论】:

  • 另外LIKE 应该像'%@Name%' 一样使用,否则它就像= 一样工作。

标签: c# asp.net sql vb.net filtering


【解决方案1】:
SELECT * FROM Profiles WHERE (Sport = ISNULL(@Sport, Sport), Region = ISNULL(@Region, Region), Name LIKE ISNULL(@Name, Name),...

如果 "empty" 不是 NULL(但说是空字符串),那么您可以选择使用 CASE,就像这样

SELECT * FROM Profiles WHERE (Sport = CASE WHEN @Sport != '' THEN @Sport ELSE Sport END, ...

【讨论】:

  • WHERE 子句中使用ISNULL() 函数是一种不好的做法。
【解决方案2】:

应该如下——只要保证当一个下拉菜单没有被选中时,参数设置为NULL

SELECT * FROM Profiles 
WHERE (@Sport IS NULL OR Sport = @Sport)
    AND (@Region IS NULL OR Region = @Region)
    AND (@Name IS NULL OR Name LIKE @Name)

【讨论】:

    【解决方案3】:

    尝试以下方法:

    String query = "SELECT * FROM Profiles WHERE";
    
    if(ddlSports.SelectedIndex>0)
      query +=" Sports='"+ddlSports.SelectedValue+"' &";
    
    if(!String.IsNullOrEmpty(txtRegion.Text))
      query +=" Region='"+txtRegion.Text+"' &"
    ..
    .. 
    ..
    and so on
    
    query = query.TrimEnd('&');
    

    【讨论】:

    • 不需要使用动态 sql - 这在常规 sql 中是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2018-04-16
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多