首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 中 WHERE 1=1 與 1<>1 的實務用法解析

     編輯:MySQL 資料庫相關知識

在動態 SQL 建構與資料表結構複製等場景中,WHERE 1=1(永真條件)與 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 1=1:動態 SQL 組裝的萬用前綴

在程式碼中動態拼接 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) 等永假條件,皆可依資料庫方言與可讀性偏好選擇。

四、效能考量

現代資料庫最佳化器會自動識別並移除永真/永假條件,不會產生額外掃描成本。但在極舊版本或特定引擎中,建議檢視執行計畫確認。

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