Day 19

SQL 解析器的設計思維

提取 Select 欄位與條件,協助開發者掌握舊系統隱藏邏輯

自動化作業工具系列分享

關於本議程

目標聽眾

  • 負責維護龐大 Legacy System 的工程師
  • 需要釐清資料流向的系統分析師 (SA)
  • 對 AST (抽象語法樹) 應用感興趣的開發者

核心價值

透過工具自動化剖析 SQL,取代傳統「人工肉眼看 Code、手動盤點欄位」的高風險作業模式。

為什麼我們需要解析工具?

痛點一 邏輯黑盒子:舊系統動輒數百行的 SQL 視圖,隱藏了關鍵的商業運算邏輯。

痛點二 文件與程式脫節:資料庫欄位名稱改變,但系統交接文件早已年久失修。

痛點三 人工作業極限:人工比對 SELECT 欄位與 WHERE 條件,耗時且極易發生漏看的人為疏失。

靈感來源與實作契機

在我們整理《自動化作業工具操作手冊彙編》的過程中,發現組織內充滿了各種自動化需求,例如:

  • 重大訊息讀取工具
  • 新聞標題內容彙整工具
  • SQL 解析工具 今日主角

我們希望能將這套「解析 SQL 指令以取得初步結果」的思維,轉化為具體的系統開發架構。

什麼是 SQL 解析器?

SQL 解析器 (Parser) 是一支能將純文字的 SQL 語句,轉化為電腦可理解的結構化資料的程式。


SELECT a.id, b.name 
FROM orders a 
JOIN users b ON a.uid = b.id 
WHERE a.amt > 1000
                        

{
  "fields": ["a.id", "b.name"],
  "tables": ["orders", "users"],
  "conditions": ["a.amt > 1000"]
}
                        

解析器核心架構

將 SQL 文字轉換為結構化資料,通常經歷三個階段:

  1. Lexical Analysis (詞法分析):將字串切成 Token。
  2. Syntax Analysis (語法分析):將 Token 組成 AST (抽象語法樹)。
  3. Visitor / Extractor (邏輯提取):走訪 AST,抽取出我們需要的欄位與關聯。

階段一:詞法分析

如同將一段話拆解為單字。Lexer 會忽略空白與註解,將 SQL 切割成最小單位的 Token

輸入:SELECT id FROM users

輸出 Token 陣列:

  • [KEYWORD] : SELECT
  • [IDENTIFIER] : id
  • [KEYWORD] : FROM
  • [IDENTIFIER] : users

階段二:建立 AST

Parser 負責檢查這些 Token 是否符合 SQL 文法,如果正確,就會建立出抽象語法樹 (Abstract Syntax Tree)

在 AST 中,所有的查詢都被組織成階層結構:

  • Root Node (Select Statement)
  • Columns List
  • From Clause (Tables & Joins)
  • Where Clause (Filters)

實戰:提取 SELECT 欄位

當我們掌握了 AST,就能針對 Columns List 節點進行尋訪。

設計重點:

  • 處理別名 (Alias):例如 u.user_name AS Name,需同時記錄原始欄位與別名。
  • 處理聚合函數:如 SUM(amount),需判斷並標記這是一個運算結果,而非單一實體欄位。
  • 萬用字元解析:遇到 SELECT *,必須依賴資料庫 Schema 才能還原實體欄位。

實戰:解析 JOIN 關聯

理解舊系統的精髓,在於理解資料表之間是如何互動的。

走訪 From Clause 時,我們需萃取:

  1. 左表 (Left Table) 及其別名
  2. 右表 (Right Table) 及其別名
  3. JOIN 類型 (INNER, LEFT, RIGHT)
  4. ON 條件 (外鍵關聯邏輯)

實戰:提取 WHERE 條件

WHERE 節點通常是一個二元樹 (Binary Tree) 的結構(AND / OR)。

提取挑戰:

  • 多層括號邏輯:(A AND B) OR C 需精準還原條件組合。
  • 變數綁定:識別 WHERE id = @userId,協助後端工程師盤點 API 必填參數。
  • 隱藏的業務規則:提取出 Hardcode 的常數(如 status = 'ACTIVE')。

工具介面與操作步驟

呼應我們《操作手冊彙編》中的極簡精神,工具操作應保持直覺:

  1. 第一步:開啟 SQL 解析工具 (可以是 Web SPA 或巨集工具)。
  2. 第二步:在輸入區(黃框處)貼入複雜的 SQL 指令。
  3. 第三步:點選 解析 SQL 指令 按鈕。
  4. 第四步:系統立即輸出結構化的表單,列出「來源表、產出欄位、過濾條件」。

技術選型建議

前端/Node.js 生態

  • node-sql-parser:支援多種方言,開箱即用。
  • antlr4:功能強大,可根據特定資料庫的語法自定義 Parser。

Python 生態

  • sqlparse:無依賴的純 Python 庫,適合快速切割與格式化。
  • mo-sql-parsing:將 SQL 轉為易讀的 JSON 格式。

結合自動化作業

當 SQL 變成了結構化資料 (JSON),我們就能無限擴充它的應用!

  • 自動產出資料字典:匯出至 Excel/PDF 供稽核備查。
  • 整合 RPA:搭配 UiPath 自動化機器人,進行跨系統欄位比對。
  • 血緣分析 (Data Lineage):追蹤底層資料庫到最終報表的資料流向。

導入效益總結

  • 提升效率:數千行 SQL 邏輯分析時間從「小時級」縮短為「秒級」。
  • 降低人為錯誤:機器解析不會漏看任何一個 WHERE 條件或 JOIN 關聯。
  • 知識留存:系統化的提取工具,讓新進同仁能快速掌握舊系統邏輯,不再依賴資深員工的記憶。

Q & A

感謝您的聆聽

自動化工具的價值,在於將重複且高風險的工作,
轉交給可靠的程式碼去執行。