首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL WHERE 1=1 寫法深度解析:動態 SQL 構造的「萬能墊片」與 1=0 建表技巧

     編輯:關於SqlServer

痛點:動態拼接 WHERE 子句的邏輯漏洞

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" → 語法錯誤

解法:WHERE 1=1 作為「永真條件」墊片

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,略顯囉嗦日志分析時需心理過濾

姊妹篇:WHERE 1=0 —— 只取結構不取數據

-- 1. 快速建表(結構+索引+約束,無數據)
SELECT * INTO new_table FROM old_table WHERE 1=0;

-- 2. 僅獲取元數據(列名、類型),ADO.NET FillSchema 同理
SELECT * FROM huge_table WHERE 1=0;  -- 秒級返回,無 I/O

最佳實踐建議

  1. 新代碼請用參數化 + 動態 SQL 構造器(如 Dapper.SqlBuilder、EF Core 動態 LINQ),根治拼接痛點。
  2. 存量字符串拼接代碼,WHERE 1=1 是最低成本修復方案,可放心使用。
  3. WHERE 1=0 建表/取結構屬於「冷知識」,關鍵時刻能救急(如臨時表創建、元數據讀取)。

結語

WHERE 1=1 不是黑魔法,只是動態 SQL 拼接邏輯的一個「佔位符」。理解其本質,配合參數化查詢,才是寫出安全、高效、可維護數據訪問代碼的正道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved