SheepDev

SQL與測試資料

將 ID 或名稱清單轉為 SQL IN 子句

使用工具

給商品代碼加引號和逗號看似機械,但 001 若當數值會變成 1,NULL 是否加引號也改變含義。IN 產生器能整理運算式,卻不能猜欄位型別和意圖,應先用小例子檢查表示。

純數字代碼也可能是字串

逐行輸入 001、010、O'Reilly,選擇字串、欄 code。PostgreSQL 範例得到 '001'、'010'、'O''Reilly'。前導零保留,內部單引號加倍;型別應由目標欄意義決定,不能只看是否數字。

字串條件範例
"code" IN ('001', '010', 'O''Reilly')

欄名留空僅產生括號值列表,無法從輸出知道目標欄,審核時帶欄名更明確。識別字輸入受限,不是任意 SQL 運算式入口;複雜運算式應另查產生部分如何嵌入。

了解空行與重複的處理

一行一值,首尾空白會刪除、空行忽略、完全相同字串去重,因此不適合保留有意義的首尾空格或直接表示空字串。這裡也不是 CSV 剖析器,貼上逗號行前先確認格式。

去重依據文字相等,不模擬資料庫數值或定序規則。1 與 01 可保留為不同輸入,卻在數值比較中相等,大小寫也取決資料庫定序條件。因此輸入數量不一定等於結果數量。

IN 內寫 NULL 不等於 IS NULL

查四字母文字 NULL 應用 'NULL',查 SQL 空值則不同。選擇獨立條件策略並指定欄,會在一般 IN 之外產生 IS NULL。若意圖不明,可用拒絕策略先停下確認。

將 alpha 與 SQL NULL 分開
("code" IN ('alpha') OR "code" IS NULL)

OR 整體帶括號,避免併入 AND 時意外擴大範圍。含 NULL 時,把 IN 文字替換成 NOT IN 不一定得到預期補集。應先列出要包含和排除的具體列,再設計否定條件。

應用查詢要使用正確參數繫結

範例引用正確不意味著應用可直接拼接使用者輸入,應使用驅動參數繫結,將值和結構分開。佔位符轉換可檢查寫法與對應,但不驗證真實連接或執行安全。

尤其 MySQL,應按執行設定和實際字串複核引用規則,工具不保證所有資料庫設定相容。大列表還有參數上限、敘述長度和執行計畫問題,能產生長 IN 不等於適合或高效。

使用前回看原始列表

檢查目標欄、型別、前導零、引號、空行、重複和 NULL 策略。格式化周邊 SQL 可查看括號範圍,並說明列表是全集還是子集。引用正確不能修復來源資料遺漏。

瀏覽器產生不改資料庫,複製到別處執行則是另一項操作。用於 UPDATE、DELETE 條件時須按目標環境審核授權。本文是整理可理解條件,先以小型虛構樣本確認值的處理。

IN 清單順序不決定結果順序

IN 中寫 B、A、C 不要求結果按此順序返回,IN 判斷成員而非展示順序。需要排序應另行按資料庫設計 ORDER BY 等。產生文字保留輸入順序不等於回傳列有序,目視逐列核對前應確定穩定鍵。

IN 重複一個值不要求重複回傳列,但表裡多列相同值可能都符合。輸入數與結果數不同還可能因不存在代碼、型別、定序規則或原表重複。工具不連 DB,不能保證符合幾列。

大清單即使能產生仍可能超過 DB 文長或參數上限,工具上限不等於伺服器上限。應用應選擇參數繫結及合適批次比對方式。可用本工具檢查引用清單,但不能據此任意串接使用者輸入。

參考資料

使用工具

指南 →