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。若意圖不明,可用拒絕策略先停下確認。
("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 文長或參數上限,工具上限不等於伺服器上限。應用應選擇參數繫結及合適批次比對方式。可用本工具檢查引用清單,但不能據此任意串接使用者輸入。