我想在这里过滤这些值,比如说columnA,然后按columnB等等,但是如果过滤器valueA只是一个空字符串,那么不会发生任何过滤,所有的值都被接受。同样,如果valueB为空,则不会进行过滤。
这是一个通用的mysql查询,我希望只有当valueA或valueB (包含或)的值不是null、空格或空字符串时才进行过滤。
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))发布于 2021-11-01 10:39:23
作为一种语言,
NULL能够执行并滥用@value IS NULL OR [Column] = @value然而在生产数据库中做(可能)是一件可怕的事情,因为(即使到了2021年)我不知道有任何主要的RDMBS正确地处理这种情况,而您最终得到的是非常非常差的执行RDMBS在您的情况下,执行以下操作:
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...
}发布于 2021-11-01 10:32:45
您可以使用简单的OR逻辑,并且在C#端检查空白更加容易
注意使用参数化来防止SQL注入注意使用多行字符串使查询更易于阅读
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);对于大型表,性能可能不是很好,因此可能需要使用完全独立的查询
https://stackoverflow.com/questions/69795440
复制相似问题