在動態 SQL 建構與資料表結構複製等場景中,WHERE 1=1(永真條件)與 WHERE 1<>1(永假條件)是極具實用價值的技巧。本文解析其核心用法與應用場景。
利用永假條件,使 SELECT 不返回任何資料列,僅保留欄位定義,配合 CREATE TABLE ... AS SELECT 語法即可快速建立同結構空表。
-- Oracle / PostgreSQL / MySQL (搭配 IGNORE)
CREATE TABLE table_temp TABLESPACE tbs_temp AS
SELECT * FROM table_ori WHERE 1<>1;
-- SQL Server
SELECT * INTO table_temp FROM table_ori WHERE 1<>1;
結果:table_temp 擁有與 table_ori 完全相同的欄位、資料類型、可為空屬性,但不包含任何資料列。索引、主鍵、外鍵等約束需另行建立。
在程式碼中動態拼接 WHERE 子句時,若直接拼接條件,當使用者未選擇任何篩選條件會導致 SQL 語法錯誤(如 WHERE AND name='abc')。預先加上 WHERE 1=1 後,後續條件統一以 AND 開頭拼接,無論有無條件語法皆合法。
-- 偽代碼示範
lv_string := 'SELECT tbl_name, tbl_desc FROM tbl_test WHERE 1=1 ' || l_condition;
-- 使用者選擇名稱 'abc' 時
l_condition := 'AND tbl_name = ''abc''';
-- 生成:WHERE 1=1 AND tbl_name = 'abc'
-- 使用者未選擇條件時
l_condition := '';
-- 生成:WHERE 1=1 (等同於無篩選條件)
若無 1=1,空條件時將產生 WHERE 尾隨導致語法錯誤。
1=1、'a'='a'、EXISTS (SELECT 1) 等永真條件;1<>1、'a'='b'、NOT EXISTS (SELECT 1) 等永假條件,皆可依資料庫方言與可讀性偏好選擇。
現代資料庫最佳化器會自動識別並移除永真/永假條件,不會產生額外掃描成本。但在極舊版本或特定引擎中,建議檢視執行計畫確認。