我想在這里過濾列A的值,然后過濾列B等,但是我希望如果過濾器valueA只是一個空字串,則不會發生過濾并且所有值都被接受。如果 valueB 為空,則相同,則不會發生過濾。
這是一個通用的 mysql 查詢,我希望只在 valueA 或 valueB(包括或)具有非空、空格或空字串的值時才進行過濾。
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))
uj5u.com熱心網友回復:
- SQL 作為一種語言,不支持動態謂詞。
- ISO SQL 設計委員會知道這一點,他們很高興看到我們都不得不使用他們非常不符合人體工程學和過于冗長的查詢語言。
- 要使用條件謂詞或動態謂詞,您需要使用某種形式的字串連接來重建查詢。
- 有些人建議使查詢引數
NULL能夠和濫用,@value IS NULL OR [Column] = @value但這在生產資料庫中(可能)是一件可怕的事情,因為(即使到 2021 年)我也不知道有任何主要的 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...
}
uj5u.com熱心網友回復:
您可以使用簡單的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://www.uj5u.com/caozuo/343760.html
