我有一個接受 3 個引數的存盤程序,如果引數不為空,誰能建議有條件地添加到 where 子句的最有效方法是什么?
目前我有:
where ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)
如果引數@email 不為空,我想添加到這里,因此有條件地執行以下操作
AND [Email] = @email
提前致謝,我希望這是有道理的
uj5u.com熱心網友回復:
沒有理由不能在代碼中動態構建包含引數的 SQL,并在擴展 SQL 文本時為引數動態添加值。它看起來像:
var sql = "SELECT * FROM Table WHERE ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)";
var cmd = new SqlCommand(sql, connection);
cmd.Parameters.Add("@dateFrom", SqlDbType.DateTime).Value = dateFrom;
cmd.Parameters.Add("@dateTo", SqlDbType.DateTime).Value = dateTo;
if(email != null){
cmd.CommandText = " AND [Email] = @email";
cmd.Parameters.Add("@email", SqlDbType.VarChar, SIZE_OF_DB_COLUMN_HERE).Value = email;
}
當然,您應該選擇SqlDbType與資料庫中實際內容相匹配的內容。如果是 adatetime2(7)那么就有點羅嗦了;
cmd.Parameters.Add(new SqlParameter("@paramName", SqlDbType.DateTime2) { Scale = 7, Value = someVariable });
如果您使用 Dapper 進行資料庫訪問,只需以類似的方式擴展 SQL 文本和引數集合
var sql = "SELECT * FROM Table WHERE ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)";
var d = new Dictionary<string, object>(){
{ "@dateFrom", dateFrom },
[ "@dateTo", dateTo }
};
if(email != null){
sql = " AND [Email] = @email";
d["@email"] = email;
}
var r = conn.Query<TypeOfObjectHere>(sql, d);
如果您使用 EF 執行此操作,您可以利用以下事實:您可以多次呼叫 Where 并且它的作業方式類似于 AND:
var q = context.Logins.Where(l =~> l.LoggedIn >= dateFrom && l.LoggedIn <= dateTo);
if(email != null)
q = q.Where(l => l.Email == email);
var result = q.ToList();
uj5u.com熱心網友回復:
嘗試使用ISNULL或COALESCE像這樣
SELECT
*
FROM YourTable
WHERE ([LoggedIn] >= @dateFrom and [LoggedIn] <= @dateTo)
AND ISNULL(Email,'') = COALESE(@email,Email,'')
所以如果@email是的NULL話,它會真正起作用email = email
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358156.html
標籤:sql sql-server
上一篇:Postgresql列參考不明確
下一篇:如何阻止用戶編輯網址
