string sql = "SELECT * FROM table WHERE";
if (age.HasValue) sql += " Age = " + age.Value;
if (city.HasValue) sql += " AND City = '" + city.Value + "'";
// 若兩條件皆無 → "SELECT * FROM table WHERE" → 語法錯誤
string sql = "SELECT * FROM table WHERE 1=1";
if (age.HasValue) sql += " AND Age = " + age.Value;
if (city.HasValue) sql += " AND City = '" + city.Value + "'";
// 無條件 → "SELECT * FROM table WHERE 1=1" 等價全表掃描
// 有條件 → "SELECT * FROM table WHERE 1=1 AND Age=18 AND City='北京'" 正常運行
| 維度 | 優點 | 缺點/風險 |
|---|---|---|
| 代碼簡潔度 | 統一用 AND 拼接,無需首條件特判 | 無 |
| 執行計劃 | 優化器會自動常量折疊消除 1=1,零開銷 | 極舊版本(SQL 2000 早期)可能不消除,現代版本無影響 |
| SQL 注入 | 與拼接方式無關,**必須參數化** | 字符串拼接本身有注入風險,1=1 不增加也不減少 |
| 可讀性 | 生成的 SQL 多一個 1=1,略顯囉嗦 | 日志分析時需心理過濾 |
-- 1. 快速建表(結構+索引+約束,無數據)
SELECT * INTO new_table FROM old_table WHERE 1=0;
-- 2. 僅獲取元數據(列名、類型),ADO.NET FillSchema 同理
SELECT * FROM huge_table WHERE 1=0; -- 秒級返回,無 I/O
WHERE 1=1 是最低成本修復方案,可放心使用。WHERE 1=0 建表/取結構屬於「冷知識」,關鍵時刻能救急(如臨時表創建、元數據讀取)。WHERE 1=1 不是黑魔法,只是動態 SQL 拼接邏輯的一個「佔位符」。理解其本質,配合參數化查詢,才是寫出安全、高效、可維護數據訪問代碼的正道。