SQL 查詢使用的逗號分隔清單必須遵循單引號與內嵌引號的跳脫規則,這跟一般的 CSV 不同,所以貼上欄位的瀏覽器工具可以產生一個乾淨的起始清單,但是在清單進入 WHERE IN 或 VALUES 子句之前,必須先完成包裹動作與內部引號的加倍。這個 欄位轉換為逗號分隔清單 工具會在當前瀏覽器中處理欄位到字串的轉換,接受資料庫匯出和試算表欄位實際產生的換行符號,並顯示最終的值數量,讓缺少或重複的資料列在清單進入查詢之前就能被看見。由於 SQL 引號使用的是單引號而非雙引號,CSV 引用格式的輸出在成為可用的 SQL 字面值之前必須經過重寫。本文剩下的部分會逐步說明清單在 SQL 陳述式中應該呈現的樣子、工具不會套用的引號規則、安全轉換的確切步驟、工具強制執行的限制與換行符號,以及會影響輸出能否直接貼上或仍需要編輯的目標位置。

逗號分隔清單在 SQL 查詢中呈現的樣子
SQL 的逗號分隔清單是一系列以逗號分隔的字串字面值。一個字串字面值以單引號 (') 開頭和結尾,而值內部任何單引號都必須寫兩次來跳脫。'apple'、'banana'、'cherry' 這個清單是三個字面值,逗號後面有空格;'O''Brien'、'Smith, Jane'、'6" bolt' 這個清單是三個字面值,內部含有單引號、內嵌逗號和內嵌雙引號。這種引號規則是由 SQL 標準規定,並且被所有主流資料庫引擎所採用。
逗號分隔清單通常嵌入在兩個位置:像是 WHERE region IN (...) 的 WHERE IN 子句,或是 INSERT 陳述式中使用的多列 VALUES 子句。在這兩種情況下,逗號分隔清單都是 SQL 陳述式的一部分,引擎會將周圍的引號、逗號和跳脫後的單引號視為語法。一個從貼上工具得到的清單,如果帶有 CSV 風格的雙引號、完全沒有引號,或是帶有未加倍的單引號,就不是一個有效的 SQL 片段;它只是恰好含有逗號的純文字。
這就是為什麼「將欄位轉換為逗號分隔 SQL 清單」這個說法有些誤導。將欄位轉換為序列是容易的部分。包裹、跳脫,以及邊界字元的驗證,才是必須依據目標引擎規則來完成的部分。把這兩件工作混為一談,會產生在安靜的測試資料庫上能正確解析、卻在遇到含有撇號或逗號的值時立刻失敗的清單。
這個工具不會套用的 SQL 引號規則
這個瀏覽器工具預設採用 CSV 風格的引號:每個值都用雙引號包裹,而每個內嵌的雙引號都加倍。Smith, Jane 這個值會變成 "Smith, Jane",這是一個含有逗號的 CSV 欄位。6" bolt 這個值會變成 "6"" bolt",這是一個含有必要加倍雙引號的 CSV 欄位。像是試算表、可識別 CSV 的應用程式,以及許多資料庫匯入工具都直接接受這種格式。
SQL 的消費者並不接受。SQL 使用單引號作為字串字面值,並且透過加倍來跳脫內嵌的單引號。同樣的 Smith, Jane 值在 SQL 字面值中會變成 'Smith, Jane',內部不需要加倍,因為在 SQL 中逗號不是引號字元。同樣的 6" bolt 值會變成 '6" bolt',內部同樣不需要加倍,因為在 SQL 中雙引號沒有特殊意義。同樣的 O'Brien 值會變成 'O''Brien',撇號會被加倍以進行跳脫。這些引號規則屬於 SQL 文法的一部分,而這個工具並不會嘗試套用它們。這個工具的合約明確指出,它不會推斷 SQL 字面值語法,並且建議針對目標位置使用專用的 SQL 工作流程。
這樣的分離是重要的。將 CSV 引用格式的輸出複製到 SQL 編輯器的讀者,會看到引擎拒絕該陳述式,或者更糟的是接受一個損壞的版本,其中雙引號會被視為識別符號或在不知情的情況下被移除。最安全的模式是使用工具來清理欄位,然後在將清單貼到查詢之前,用單引號重新包裹每個值,並將任何內嵌的單引號加倍。對於重複性或大量性的工作,在應用程式程式碼中使用繫結參數會比串接字面值更安全,因為資料庫驅動程式會自動處理跳脫。
用五個步驟將欄位轉換為 SQL 的逗號分隔清單
- 從來源複製一個欄位——可以是資料庫匯出、試算表、記錄檔,或 SELECT 結果——不含標題列。CRLF、CR 和 LF 換行全部都能接受。
- 將值貼到「欄位轉換為逗號分隔清單」工具的輸入框中。讓 移除周圍空白 和 移除空白行 保持啟用,這樣雜散的周圍空白和空行就不會進入最終清單。
- 只有在重複值在目標位置確實沒有意義時,才啟用 移除重複值。去除重複是精確且區分大小寫的,因此 Apple 和 apple 會保持為不同的項目,因為悄悄改變大小寫可能會改變識別符號、產品代碼,或是在區分大小寫的定序下會被拒絕的代碼。
- 執行 轉換欄位。檢查唯讀輸出框下方顯示的值數量,並與來源中預期的唯一資料列數量進行比對。
- 將 CSV 的雙引號重寫為 SQL 的單引號,並將值內部任何內嵌的單引號加倍。如果一個值含有像是 O'Brien 的撇號,在最終的 SQL 片段中必須寫成 'O''Brien'。在貼到 WHERE IN 或 VALUES 子句之前,根據前一節的規則驗證結果。
限制、換行符號,以及結果數量告訴你的事
這個工具強制執行兩項硬性限制:500,000 個輸入字元和 10,000 行。如果超過任一限制,處理作業會明確失敗,這能保護頁面反應速度,避免非常大的貼上內容消耗瀏覽器的記憶體。對於 SQL 工作來說,10,000 行對於一般的 IN 清單、多列 VALUES 區塊或小型查找表已經相當充裕,但它無法取代資料庫端的聚合函式,例如 STRING_AGG 或 GROUP_CONCAT,這類函式可以產生跨越數百萬列的清單。
換行符號會在分割步驟中進行正規化。Windows 的 CRLF、舊式的 CR 和 Unix 的 LF 都會產生相同的行清單,因此從 Windows 上的 Excel 複製的欄位、從 Linux 上 PostgreSQL 匯出的欄位,以及從 macOS Numbers 表格複製的欄位,行為都完全相同。值內部的 Tab 字元和其他空白字元會被保留;只有每個值結尾的換行符號會被視為分隔符號。
輸出下方顯示的結果數量,是套用所選清理選項後最終清單中的值數量。這個數字是最可靠的健全性檢查。如果來源有 1,243 個非空白列,而數量顯示為 1,240,表示有三列因為去除重複或移除空白行而被移除;如果顯示為 1,243 且啟用了去除重複,表示沒有任何重複的列,修剪和移除空白的選項也沒有影響這個數量。轉換前的 行數計算 步驟會回報總行數、非空白行數和空白行數,以及最長行的長度,這通常是在將欄位送給轉換器之前確認內容最快速的方式。
結果適合放在哪裡,以及不適合放在哪裡
| 目標位置 | 所需的引號風格 | 如何處理工具的輸出 |
|---|---|---|
| SQL IN 子句 | 單引號,內部單引號加倍 | 將 " 替換為 ',然後將值內部任何 ' 加倍 |
| SQL 多列 VALUES | 單引號,內部單引號加倍 | 同樣的重寫方式;如果缺少,加上外層的括號 |
| CSV 匯入試算表 | 雙引號,內部雙引號加倍(預設) | 直接使用輸出 |
| JSON 陣列 | 雙引號,反斜線和引號經過跳脫 | 改用 JSON 格式化工具 |
| URL 參數清單 | 百分比編碼,外層不加引號 | 改用 URL 編碼工具 |
| 命令列引數 | 特定於 shell 的引號(通常是單引號) | 改用 shell 跳脫工具 |
這個表格從性質上描述了目標位置與引號風格之間的關係。任何單一值中的確切字元取決於來源資料,而且在重寫包裹之前,可以使用這個工具來確認可見的值數量。
對於 SQL 工作來說,即使在轉換之後,將每個欄位加上引號仍是比較安全的預設做法,因為這樣可以讓空白或對空白敏感的值在輸出中的邊界變得清楚。一個寫成 " "、""、"x" 的清單很明顯是三個值;一個寫成 ,, x 的清單則是模糊的,解析它的引擎可能會產生與原本欄位不一致的結果。
搭配此工作流程的其他瀏覽器工具
一旦欄位成為逗號分隔的字串,有幾個相關任務是很常見的。SQL IN 子句的引號與跳脫正是這個轉換器拒絕執行的任務——這是一個刻意的範圍選擇——因此需要完成 SQL 字面值的讀者通常會在他們的資料庫用戶端或小型腳本中自行建構。為每行加上引號 工具會以所選的引號風格包裹每一行的值,並跳脫內部對應的引號,這比欄位轉換器更貼近 SQL IN 子句和 JSON 陣列的需求。移除重複行 步驟在轉換前執行其實是多餘的,因為轉換器本身已經執行這個動作,但當必須在合併前檢視去除重複的結果,或當比較規則需要不區分大小寫的匹配時,這個專用工具仍然很有用。這個轉換器不會嘗試解析 SQL 文法或任何其他目標位置的語法,因此對 SQL 工作來說,最安全的最終狀態是:一個已經被檢查過一次、重寫過一次,然後交給參數化查詢(而不是串接到陳述式文字中)的清單。