首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当筛选器值不是空字符串、空白或null时才过滤MySQL查询

仅当筛选器值不是空字符串、空白或null时才过滤MySQL查询
EN

Stack Overflow用户
提问于 2021-11-01 10:13:13
回答 2查看 136关注 0票数 0

我想在这里过滤这些值,比如说columnA,然后按columnB等等,但是如果过滤器valueA只是一个空字符串,那么不会发生任何过滤,所有的值都被接受。同样,如果valueB为空,则不会进行过滤。

这是一个通用的mysql查询,我希望只有当valueA或valueB (包含或)的值不是null、空格或空字符串时才进行过滤。

代码语言:javascript
复制
   using (var cmd = new MySqlCommand(
                    " SELECT columnA, columnB etc
                    " FROM table" +
                    " WHERE columnA = '" + valueA + "' " +
                    " THEN BY columnB = '" + valueB + "' " +
                    " GROUP BY columnA" +
                    " LIMIT 0, 100",
                    connection))
EN

回答 2

Stack Overflow用户

发布于 2021-11-01 10:39:23

作为一种语言,

  • SQL不支持动态谓词。
    • ISO SQL设计委员会知道这一点,他们高兴地看到我们所有人都不得不使用他们可怕的不符合人体工程学和过于冗长的查询language.

  • 要使用条件谓词或动态谓词,您需要使用某种形式的字符串连接来重新构建查询。
    • 有些人建议使查询参数NULL能够执行并滥用@value IS NULL OR [Column] = @value然而在生产数据库中做(可能)是一件可怕的事情,因为(即使到了2021年)我不知道有任何主要的RDMBS正确地处理这种情况,而您最终得到的是非常非常差的执行RDMBS

在您的情况下,执行以下操作:

代码语言:javascript
复制
String sql;
List<MySqlParameter> parameters = new List<MySqlParameter>();

{
    StringBuilder sb = new StringBuilder( "SELECT columnA, columnB, FROM table" ).AppendLine();
    
    List<String> predicates = new List<String>();
    if( valueA != null )
    {
        predicates.Add( "columnA = @pA" );
        parameters.Add( new MySqlParameter( "@pA", valueA ) );
    }

    if( valueB != null )
    {
        predicates.Add( "columnB = @pB" );
        parameters.Add( new MySqlParameter( "@pB", valueB ) );
    }

    // etc
    
    if( predicates.Count > 0 )
    {
        _ = sb.AppendLine( "WHERE" );
        _ = sb.AppendLine( String.Join( " AND ", predicates ) );
    }

    //

    _ = sb.AppendLine( "ORDER BY foo GROUP BY bar LIMIT 0, 100" );

    sql = sb.ToString();
}

using( var cmd = new MySqlCommand( sql, connection ) )
{
    cmd.Parameters.AddRange( parameters );

    cmd.Execute...
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-01 10:32:45

您可以使用简单的OR逻辑,并且在C#端检查空白更加容易

注意使用参数化来防止SQL注入注意使用多行字符串使查询更易于阅读

代码语言:javascript
复制
const string query = @"
SELECT columnA, MAX(columnB) etc
FROM table
WHERE (columnA = @valueA OR @valueA IS NULL)
  AND (columnB = @valueB OR @valueB IS NULL)
GROUP BY columnA
LIMIT 0, 100;
";
using (var cmd = new MySqlCommand(query, connection))
{
    cmd.Parameters.AddWithValue("@valueA", string.IsNullOrWhiteSpace(valueA) ? (object)DBNull.Value : valueA);
    cmd.Parameters.AddWithValue("@valueB", string.IsNullOrWhiteSpace(valueB) ? (object)DBNull.Value : valueB);

对于大型表,性能可能不是很好,因此可能需要使用完全独立的查询

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

https://stackoverflow.com/questions/69795440

复制
相关文章

相似问题

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